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