char* scanString()
{
char* str = NULL;
char* temp = NULL;
int numOfChars = 0;
char c = '0';
while (c != '\n')
{
scanf(" %c", &c);
if (c != '\n')
{
if (numOfChars == 0)
{
char* str = (char*)malloc(sizeof(char));
char* temp = str;
if (str == NULL)
return str;
str[0] = c;
numOfChars ;
}
else
{
str = (char*)realloc(str, sizeof(char) * (numOfChars 1));
str[numOfChars] = c;
if (str == NULL)
return temp;
else
{
temp = str;
numOfChars ;
}
}
}
}
str = (char*)realloc(str, sizeof(char) * (numOfChars 1));
if (str == NULL)
{
str = temp;
return str;
}
str[numOfChars] = '\0';
return str;
}
int main()
{
char* m;
printf("write:\n");
m = scanString();
printf("%s\n", m);
}
我嘗試創建一個函式,用于按字符掃描未知大小的字符字串,但我不知道這里有什么問題。順便說一句,請不要接近我任何其他代碼或嘗試使用不同的庫。
uj5u.com熱心網友回復:
有一個大錯誤和一些不一致之處。
最大的錯誤在這里:
if (numOfChars == 0)
{
char* str = (char*)malloc(sizeof(char)); // Oops a new var!
char* temp = str; // and another one!
if (str == NULL)
return str;
str[0] = c;
numOfChars ;
}
您在該塊中宣告了 2 個新變數,它們將隱藏外部作用域的變數。結果,第一個字符將丟失,您將獲得一個隨機值。
不一致之處:
temp沒用,應該洗掉你用一種格式閱讀
" %c"。該格式將跳過任何空白字符,包括\n. 它應該是"%c"您未能測驗 的回傳值
scanf。在檔案末尾(任何其他讀取錯誤),您將進入無限回圈。它應該是:if (1 != scanf("%c", &c)) break;
修復此問題后,您應該會獲得預期的輸出,但仍有可能進行其他改進:
- 閱讀一個字符的慣用方式是
getc或getchar - 一次分配一個字符是一種反模式,因為(重新)分配是一項相當昂貴的操作。對于現實世界的程式,您應該始終分配一堆或記憶體并跟蹤可用部分
sizeof(char)每個標準是1- 區分 for
numOfChars == 0是沒有用的。realloc在 NULL 指標上與malloc.
uj5u.com熱心網友回復:
您的代碼過于復雜和錯誤,并在評論表示您需要更換格式字串" %c"用"%c"。
主要問題在這里:
if (numOfChars == 0)
{
char* str = (char*)malloc(sizeof(char));
您宣告了一個新str變數,它隱藏了str您在函式開頭宣告的變數。
只需替換char* str = (char*)malloc(sizeof(char))為str = malloc(sizeof(char));. 順便說一句,演員是沒有必要的。
你有同樣的問題temp。
下面的代碼完全基于您的代碼,但它更簡單和正確。基本上numOfChars不應該特別對待為 0的情況。您可以直接使用realloc,因為realloc(NULL, foo)相當于malloc(foo).
char* scanString()
{
char* str = NULL;
char* temp = NULL;
int numOfChars = 0;
char c = '0';
while (c != '\n')
{
scanf("%c", &c);
if (c != '\n')
{
str = realloc(str, sizeof(char) * (numOfChars 1));
if (str == NULL)
return temp;
str[numOfChars] = c;
temp = str;
numOfChars ;
}
}
str = realloc(str, sizeof(char) * (numOfChars 1));
if (str == NULL)
{
str = temp;
return str;
}
str[numOfChars] = '\0';
return str;
}
或者更簡單:
char* scanString()
{
char* str = NULL;
char* temp = NULL;
int numOfChars = 0;
char c = '0';
while (c != '\n')
{
scanf("%c", &c);
str = realloc(str, sizeof(char) * (numOfChars 1));
if (str == NULL)
return temp;
str[numOfChars] = c;
temp = str;
if (c == '\n')
{
str[numOfChars] = '\0';
}
numOfChars ;
}
return str;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389139.html
