如何创建 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()

此外,如果您必须自己滚动 getline() function, do it with fgetc()

你的函数的问题是你声明了太多的间接层。你声明

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;
}