我正在使用malloc并realloc從用戶那里獲取字串輸入,使用scanf: 下面的代碼是我正在使用的。我設法獲得了所有用戶的輸入,但是我的指標realloc指向字串的末尾。我怎樣才能讓它指向開始?
int main() {
char *ptr = NULL, input[2];
ptr = (char *)malloc(sizeof(char));
if (ptr == NULL) {
printf("Memory not allocated");
exit(0);
}
scanf("%c", &input[0]);
// printf("%s\n", input);
*ptr = input[0];
int counter = 1;
scanf("%c", &input[0]);
// printf("%s\n", input);
while (input[0] != '\n') {
counter ;
ptr = realloc(ptr, counter * sizeof(char));
if (ptr == NULL) {
printf("Mermory not allocated");
exit(0);
}
strncat(ptr, input,1);
scanf("%c", &input[0]);
// printf("%s\n", input);
}
printf("%s\n", ptr);
return 0;
}
uj5u.com熱心網友回復:
您使非常簡單的任務過于復雜。
int main(void)
{
char *ptr = NULL;
size_t size = 0;
int ch;
while((ch = fgetc(stdin)) != EOF && ch != '\n')
{
char *tmp = realloc(ptr, (size 2) * sizeof(*tmp));
if(!tmp) {/* handle allocation error */}
ptr = tmp;
ptr[size ] = ch;
ptr[size] = 0;
}
printf("You have entered %zu characters and the string is: `%s`\n",
size, ptr ? ptr : "(NULL)");
free(ptr);
return 0;
}
https://godbolt.org/z/soEdM6ojc
uj5u.com熱心網友回復:
但是我在 realloc 之后的指標指向字串的末尾。
不,不是。假設該塊的大小,該大小ptr指向最初小于或等于counter,并且該realloc(ptr, counter * sizeof(char))呼叫成功,將所得的值ptr指向相同資料的原始值ptr指向的,盡管它在存盤位置(該值的ptr本身)可以是不同的。由于ptr最初指向字串的開頭,因此結果realloc也指向字串的開頭或它的相同副本。
我怎樣才能讓它指向開始?
它已經做到了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/406081.html
標籤:
上一篇:yacc/bison的分段錯誤
