[英]C - values is struct pointer are not set after pointer is returned from function
[英]How to access a string from a pointer returned by a function in C
我有一个函数返回指向C中字符串的指针,并且正在尝试访问整个字符串,但不确定如何操作。
我有一个循环循环的函数,它抛出了一个包含学生数据的结构的链表,并获取了学生的名字。 我想在每个字符串的末端填充空格,以便它们都具有相同的大小。 所以我写了一个用于填充字符串的函数。 该函数返回一个指向字符串的指针,但是我不知道如何从指针访问整个字符串。 我知道我可以放* pstring来获取字符串的第一个字符,但是我对如何获取其余字符有些迷茫。
这遍历链表:
void myFunction(void) {
pStudent = pHead;
char paddedName[30];
long nameLength = 0 ;
while(pStudent->pNext != NULL){
printf("%c,\n", *padstring(pStudent->name));
strcpy(paddedName, padstring(pStudent->name));
nameLength = strlen(paddedName);
printf("%lu | %s | %s \n", nameLength, paddedName, pStudent->name);
pStudent = pStudent->pNext;
}
printf("\n");
}
这将填充并返回字符串:
char *padstring(char* string){
char name[30];
int i = 0;
while(i < 30){
if(i < strlen(string)){
name[i] = string[i];
}
else{
name[i] = ' ';
}
i++;
}
printf("%s,\n", name);
return name;
}
不必创建新的字符串。 您可以使用以下格式说明符将字符串右填充为一定长度(例如: %-30s
到右键盘, %-30s
30个字符):
printf("[%-10s]", name);
/* [Name ] */
如果您确实创建了新字符串,则需要返回有效的内存位置。 与其返回指向本地堆栈的指针,不如使用malloc
分配内存,并记住在完成内存操作后将其free
(或者由调用者传递在堆栈上分配的数组)。
如果希望将该内存返回给调用者,则需要在padstring()
动态分配name
。
char *name = malloc(30);
if (name == NULL) {
return NULL;
}
首先,您需要将字符串终止为null。 其次,您需要使用malloc在堆上创建数组(完成后确保释放内存)。
我通常更喜欢在同一字符串中进行填充。 当然,您必须确保有足够的空间来通过传递最大大小来完成。 我通过垫的长度以使其更灵活。 可以通过传递要填充的字符(如果它不总是空格)来进一步改进。
这是一个简单的例子。
#include <string.h>
#include <stdio.h>
char* padstring(char *s, int maxlen, int padlen)
{
int len = strlen(s);
if (len < padlen)
{
char *p = s + len;
while ((len < maxlen) && (len < padlen))
{
*p++ = ' '; // Add a space
*p = 0; // Null terminate
len++;
}
}
return s;
}
int main(int argc, char *argv[])
{
char s[50] = "Hello";
printf("'%s'\n", padstring(s, sizeof(s), 30));
return 0;
}
在您的情况下,无需定义新功能。 只需使用sprintf()
用空格填充字符串即可。
void myFunction(void) {
// Declare max length of name
const int MAX_LEN = 29;
pStudent = pHead;
char paddedName[MAX_LEN + 1];
long nameLength = 0 ;
while(pStudent->pNext != NULL){
// Record origin length
nameLength = strlen(pStudent->name);
// Just write spaces after pStudent->name
sprintf(pStudent->name + nameLength, "%-*s", MAX_LEN - nameLength, "");
nameLength = strlen(pStudent->name);
printf("%lu | %s | %s \n", nameLength, paddedName, pStudent->name);
pStudent = pStudent->pNext;
}
printf("\n");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.