目標是將一個字串的地址存盤在一個char*中,該char是struct id的成員。我想過使用一個陣列。 陣列的問題是,如果我把最大的字符數設定為7,那么用戶可能會輸入少于7的字符,這樣就浪費了。 可能會少于7,所以這將是一種記憶體的浪費。 使用getchar()的好處是,我可以將最大字符數設定為7,但如果用戶輸入的字符數少于7,那也是可以的。
typedef struct id
{
int age。
char* name;
}id;
id Mary;
char L。
int c =0;
printf("enter your age: ")。
scanf("%d",& Mary.age)。
printf(" Enter your name: );
如果( (L=getchar() !"='
' )
{
//在char*中存盤字串的文字。
}
printf("%s", Mary.name)。
uj5u.com熱心網友回復:
這是一個常見的問題:"我如何讀取一個長度未知的輸入字串?" Daniel Kleinstein在他的回答中提到了幾種通用的解決方案。我將在這里給出一個更加基于實作的答案
首先,你的程式并沒有試圖存盤一個字串字面意義,而是一個從輸入流(例如stdin)中讀取的字串。
其次,不可能將一個字串 "存盤在char*中"。字串被存盤在由char*指向的記憶體中。這個記憶體需要首先被分配。 下面的代碼最接近我們的要求。
下面的代碼最接近你想要做的事情。它一次讀取一個字符,并且每次將復制到的記憶體的大小增加1位元組。
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct
{[/span>
int age。
char *name;
} 身份證。
int main(void)
{
Id mary。
printf(" Enter your name: ")。
size_t nameSize = 0U;
mary.name = NULL;
while (true)
{
mary.name = (char*) realloc(mary.name, nameSize); // cast是可選的。
if (mary.name == NULL)
{
printf("記憶體分配錯誤
")。)
exit(EXIT_FAILURE)。
}
int ch = getchar(); //注意`int`型別,對于檢測EOF是必要的。
if (ch == '
' || ch == EOF)
{
mary.name[nameSize - 1] = ' ';
break。
}
mary.name[nameSize - 1] = (char) ch;
}
printf("%s
", mary.name)。)
free(mary.name)。
}
這樣做不會浪費一個位元組的記憶體,但是,頻繁的記憶體重新分配會使這段代碼變得很慢。一個很好的折衷辦法是,一次讀取一個固定長度的字串,而不是一次讀取一個字符。
實際操作是:在堆疊上創建一個固定長度的緩沖區(例如,64個字符),使用fgets讀入該緩沖區,并將內容復制到mary.name。如果字串不適合緩沖區,再次重復呼叫fgets,重新分配mary.name并將緩沖區的內容追加到mary.name,直到找到一個換行字符。
另一個更簡單的解決方案是為字串設定一個最大長度,為這個長度分配記憶體,讀取一個最大長度的字串,最后將記憶體重新分配到字串的實際大小(可能更小)。
uj5u.com熱心網友回復:
對于這類問題并沒有一個神奇的解決方案。 你的選擇是:
使用一個有最大長度的陣列--但正如你所提到的,如果用戶輸入一個較短的長度,這可能會造成浪費。然而,這通常是你在實際代碼中發現的解決方案--在實踐中,如果記憶體不是一個很大的問題,這比試圖處理其他涉及記憶體分配的動態解決方案更快、更簡單。
在用戶輸入名字之前詢問他們的名字的長度 - 然后你可以使用
char* name = malloc(input_length);, 或char name[input_length]; 在 C99 中動態分配一個適當大小的緩沖區。你也可以做一些類似于靈活陣列成員的事情:struct name { size_t length; char buffer[]; }; struct name* username 用戶名 = malloc(sizeof(*username) username_length)。如果你不想向用戶詢問用戶名的長度,你可以在每個新的
getchar之后做一連串的realloc呼叫,這將調整一個動態分配的陣列的大小 - 但這是一個可怕的想法,你甚至不應該考慮,除非你對程式中消耗的每個位元組的記憶體感到緊張。
使用一個新的 "新 "字。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/315472.html
標籤:
