簡體   English   中英

通過malloc和getchar()創建字符串

[英]Creating String through malloc and getchar()

因此,我正在嘗試編寫一個基本上通過內存分配創建字符串的程序,每個字符讀取一個字符,但是只能通過鍵盤輸入一個字符。 我知道可以有多種(更好)的方法,但是我想通過這種特殊方法來實現! 這是代碼:

int newstring (char** string)
{
printf("--------------In function newstring--------------\n");
int i = 0;
string = malloc ( sizeof (char) );
printf("Adress: %p\n", (void*)string);
if (string == NULL)
  return -1;

while ( 1 )
{
printf("Pre-scan\n");
*(string[i]) = getchar();
printf("After-scan\nstring[%d] = %c\n", i, *(string[i]));
i++;
if ( *(string[i-1]) == '\n')
  break;
printf("Reallocation to size %d\n", i+1);
string = realloc ( string, sizeof (char) * (i+1) );
if (string == NULL)
  return -1;
}

string[i-1] = '\0';
printf("--------------Exit function newstring--------------\n");
return;
}

int main()
{
char *string;
newstring ( &string );
printf("%s\n", string);
}

問題是程序總是在讀取第三個字符之前中途崩潰,這是發生的printfs:

Adress: 00AE1578
Pre-scan
 1st Input:  >>Hello
After-scan
string[0] = H
Reallocation to size 2
Pre-scan
After-scan
string[1] = e
Reallocation to size 3
Pre-scan

我想知道是否是因為緩沖區有某種限制,但是我很難相信限制是2個字符(我嘗試了多次輸入,總是卡在第3個字符之前)。 還嘗試使用“ scanf(”%c“,*(string [i]))”獲得相同的結果。

問題始於此:

string = malloc ( sizeof (char) );

string是指向實際指針的指針。 您需要取消引用它:

*string = malloc ( sizeof (char) );

然后問題繼續

*(string[i]) = getchar();

您取消引用錯誤的內容,應該是

(*string)[i] = getchar();

與其他使用錯誤的解引用的地方相同。

接着

string[i-1] = '\0';

在這里,您根本不會取消引用指針。 應該

(*string)[i-1] = '\0';

最后, getchar函數返回一個int 當您通過將結果與EOF進行比較來檢查函數是否失敗時,這一點很重要。 您根本不這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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