如何创建 scanf() 的替代品
How to create a substitute for scanf()
在使用 scanf() 函数遇到这么多问题后,我决定寻找一种替代方法来读取整个字符串(对于整个字符串,我指的是与空格和数字等混合的单词,直到找到 \n)从键盘。我在 Whosebug 上偶然发现了一段有趣的代码。
所以我将该代码更改为更加动态,我想在从键盘输入字符后分配内存。我让它工作,但只使用 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) = '[=10=]';
return *a;}
现在我正在尝试修改此函数以不接受任何参数,但我遇到了 write/read 访问冲突错误:
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) = '[=11=]';
return *a;}
提前致谢
您真的不需要自己滚动,只需使用 fgets()。
你的函数的问题是你声明了太多的间接层。你声明
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] = '[=11=]';
return a;
}
在使用 scanf() 函数遇到这么多问题后,我决定寻找一种替代方法来读取整个字符串(对于整个字符串,我指的是与空格和数字等混合的单词,直到找到 \n)从键盘。我在 Whosebug 上偶然发现了一段有趣的代码。
所以我将该代码更改为更加动态,我想在从键盘输入字符后分配内存。我让它工作,但只使用 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) = '[=10=]';
return *a;}
现在我正在尝试修改此函数以不接受任何参数,但我遇到了 write/read 访问冲突错误:
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) = '[=11=]';
return *a;}
提前致谢
您真的不需要自己滚动,只需使用 fgets()。
你的函数的问题是你声明了太多的间接层。你声明
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] = '[=11=]';
return a;
}