在使用 scanf() 函数遇到这么多问题之后,我决定寻找一种替代方法来读取整个字符串(整个字符串是指与空格和数字等混合的单词,直到找到\n)键盘。我在 stackoverflow 上偶然发现了一段有趣的代码。
所以我将该代码更改为更加动态,我想在从键盘输入字符后分配内存。我让它工作,但只能使用 char **a
作为参数,并且在 main() 中,我会这样调用它 read(&w);
。我的想法是创建一个无参数函数,这样我就可以使用它,而不必在每次需要读取字符串时声明变量 char *w
。这是我得到的代码:
char *read(char **a) {
int i = 0;
while (1) {
*a = (char *)realloc(*a, (i + 1) * sizeof(char));
scanf("%c", &(*(*a + i)));
if ( *(*a+i) == '\n')
break;
else
i++;
}
*(*a+i) = '\0';
return *a;}
现在我正在尝试修改此函数以不带参数,但出现写/读访问冲突错误:
char *read2() {
int i = 0;
char **a = NULL;
while (1) {
*a = (char *)realloc(*a, (i + 1) * sizeof(char)) // Error here
scanf("%c", &(*(*a + i)));
if (*(*a + i) == '\n') { break; }
else { i++; }
}
*(*a + i) = '\0';
return *a;}
提前致谢
最佳答案
您的函数的问题在于您声明了太多的间接级别。您声明
char **a = NULL;
然后分配给*a
。但由于 a == NULL
,这会通过空指针间接进行,这是未定义的行为。
对于局部变量,您不需要额外的间接级别,只有参数需要这样,以便您可以更新调用者的变量。
读取时还应该检查 EOF。不要使用 scanf()
,而是使用 getc()
。
char *read2() {
int i = 0;
char *a = NULL;
while (1) {
a = (char *)realloc(a, (i + 1) * sizeof(char));
int c = getc(stdin);
if (c == '\n' || c == EOF) {
break;
} else {
a[i] = c;
i++;
}
}
a[i] = '\0';
return a;
}
关于c - 如何创建 scanf() 的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42821553/