繁体   English   中英

如何从C中的函数返回的指针访问字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM