通过 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
进行比较来检查函数是否失败时,这一点很重要。你根本不这样做。
所以我正在尝试编写一个程序,基本上通过内存分配创建一个字符串,读取每个字符的字符,但仅通过键盘输入一次。我知道有多种(更好的)方法可以做到这一点,但我想通过这种特殊的方式来做到这一点! 这是代码:
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
进行比较来检查函数是否失败时,这一点很重要。你根本不这样做。