簡體   English   中英

字符串和用戶在C中輸入的字符串之間的區別是什么

[英]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);

兩種情況之間的差異:

  1. 在第一種情況下, string指向由strdup分配的有效內存,而在第二種情況下,您試圖讀入無效內存。

  2. 第一種情況表現良好,而第二種情況導致未定義的行為。

第二種情況可以通過使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM