簡體   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