[英]What's the difference between a string and a user entered string in C
我正在使用較小的代碼來測試較大(初學者)程序的功能,但我不明白兩個字符串之間的區別。
我找到並使用了:
#include <stdio.h>
#include <string.h>
int main()
{
char *string, *found;
string = strdup ("1/2/3");
printf("Orig: '%s'\n",string);
while ((found = strsep(&string,"/")) != NULL )
printf ("%s\n",found);
return (0);
}
並且這一次打印一個令牌。
然后當我嘗試移動到用戶輸入的字符串時:
#include <stdio.h>
#include <string.h>
int main()
{
char string[13],
char *found, *cp = string;
fprintf(stderr, "\nEnter string: ");
scanf("%12s",string);
printf("Original string: '%s'\n",string);
while((found = strsep(&cp,"/,-")) != NULL )
printf("%s\n",found);
return(0);
}
我得到一個段錯誤。 我理解指針,數組和字符串的基礎知識,但很明顯我錯過了一些東西,並希望有人告訴我它是什么!
另外 - 如果我更改printf("%s\\n",found);
to printf("%i\\n",found);
我得到一些垃圾整數返回,但總是正確的數量,例如,如果我輸入1/2/3
我得到三行整數, 1111/2222
我得到兩行。
謝謝!
CNC中有一個adittional問題strsep
,詳細介紹在這里 。 謝謝大家。
在第一段代碼中, string
被賦予strdup
的返回值,該值為字符串重復分配空間並返回指向該分配空間的指針。
在第二段代碼中, string
在傳遞給scanf
時未初始化,因此scanf
正在讀取該指針中的無效值並嘗試取消引用它。 這會調用未定義的行為 ,在這種情況下表現為崩潰。
您需要為用戶的字符串留出空間。 一種簡單的方法是創建一個給定大小的數組:
char string[80];
然后告訴scanf
它可以讀取多少個字符:
scanf("%79s",string);
兩種情況之間的差異:
在第一種情況下, string
指向由strdup
分配的有效內存,而在第二種情況下,您試圖讀入無效內存。
第一種情況表現良好,而第二種情況導致未定義的行為。
第二種情況可以通過使用malloc
或使用固定大小的數組為其分配內存來修復。
char *string,*found;
string = malloc(100); // Make it large enough for your need.
fprintf(stderr, "\nEnter string: ");
scanf("%99s",string);
要么
char string[100], *found;
fprintf(stderr, "\nEnter string: ");
scanf("%99s",string);
確保釋放動態分配的內存。 否則,您的程序會泄漏內存。
您應該為用戶輸入字符串分配內存。
第一種選擇是靜態的
char string[256];
第二個選項是動態使用malloc()
函數
char *string;
string = (char*) malloc(256 * sizeof(char));
if (string == NULL)
{
//error
}
不要忘記最后釋放分配的內存
free(string);
你沒有分配所需的空間! 你必須有一個可寫入的內存空間。 你可以靜態地“char string [256]”,或者動態分配。
在您的第一個示例中,您使用執行malloc的“strdup”,但scanf不會為您分配內存。
如果您想要所有用戶輸入,通常將scanf包裝在while循環中,以便按塊檢索用戶輸入塊。 然后,每次你的緩沖區insuffisante添加塊時你必須重新分配。
如果你只想從stdin檢索一個字符串而不進行任何格式檢查,我強烈建議fgets。
原因很簡單。 你的string
變量是一個char指針,你需要為它分配內存來存儲一個字符串。可能在你的第一個案例strdup ("1/2/3");
返回一個字符串,你的char pointer *string
指向strdup
函數返回的字符串,這就是你在第一種情況下沒有得到分段錯誤的原因。 即使在第一種情況下,如果輸入一個很長的字符串,也可能會出現分段錯誤。
所以在你的第二個例子中為string
指針分配足夠的內存,如下所示,這將解決你的問題: -
char *string = malloc(50);// here malloc will allocate 50 bytes from heap
在用戶輸入字符串的情況下,你沒有分配給指針字符串的內存。在第一種情況下, strdup為字符串指針分配內存,而在第二種情況下,你沒有任何與字符串指針相關的內存導致segfault。 首先,使用malloc分配內存,然后使用scanf 。
char string [13] char cp = string
這里cp是char類型的變量,並且分配了1個字節的內存
它將無法存儲13個字符的字符數組,這將是13個字節,正是因為這樣你才得到分段錯誤
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.