通过 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] = '[=10=]';
printf("--------------Exit function newstring--------------\n");
return;
}

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

问题是程序总是在读取第3个字符之前中途崩溃,这里是发生的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] = '[=14=]';

在这里你根本没有取消引用指针。应该是

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

最后,getchar 函数 returns 和 int。当您通过将结果与 EOF 进行比较来检查函数是否失败时,这一点很重要。你根本不这样做。