我正在学习C编程,我必须实现一个读取未知大小的输入字符串的程序。 我写了这段代码:
Queen
但是最后一个int main() {
char *string;
char c;
int size = 1;
string = (char*)malloc(sizeof(char));
if (string == NULL) {
printf("Error.\n");
return -1;
}
printf("Enter a string:");
while ((c = getchar()) != '\n') {
*string = c;
string = (char*)realloc(string, sizeof(char) * (size + 1));
size++;
}
string[size - 1] = '\0';
printf("Input string: %s\n", string);
free(string);
return 0;
}
没有显示整个字符串,只显示了最后一个字符。
因此,如果我输入printf
最后hello, world
次打印printf
。
经过一番研究后,我尝试了this代码并且它有效!但我并没有与我的不同。
我希望自己清楚明白,谢谢你的关注。
答案 0 :(得分:5)
在您的代码版本中,您使用以下内容将新读取的字符c
分配给string
:
*string = c;
*string
指向字符串的开头,这样你就可以用新读取的字符替换字符串的第一个字符。
您链接的代码执行以下操作:
str[i] = c
基本上,它使用索引i
将字符分配给字符串的末尾。
在您的代码版本中,您可以使用size - 1
代替i
。
答案 1 :(得分:3)
尝试更改:
*string = c;
要:
string[size-1] = c;
这样你就不会每次都覆盖第一个角色。
答案 2 :(得分:3)
您的代码存在一些问题:
char
变量,无法正确测试EOF
。'\n'
,则最终崩溃,例如从空文件重定向。以下是更正后的版本:
#include <stdio.h>
#include <stdlib.h>
int main() {
char *string;
int c;
int len = 0;
string = malloc(1);
if (string == NULL) {
printf("Error.\n");
return -1;
}
printf("Enter a string:");
while ((c = getchar()) != EOF && c != '\n') {
string[len++] = c;
string = realloc(string, len + 1);
if (string == NULL) {
printf("cannot allocate %d bytes\n", len + 1);
return -1;
}
}
string[len] = '\0';
printf("Input string: %s\n", string);
free(string);
return 0;
}
关于与链接代码的区别的问题,它使用相同的方法,少了一个bug,还有一个bug:
str
。'\n'
,则会运行无限循环,与您的相同。c
未针对第一次测试进行初始化。答案 3 :(得分:1)
试
*(string + size - 1) = c;
也许这有帮助