Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建scanf()的替代品_C_Function_Scanf_Dynamic Allocation - Fatal编程技术网

如何创建scanf()的替代品

如何创建scanf()的替代品,c,function,scanf,dynamic-allocation,C,Function,Scanf,Dynamic Allocation,在使用scanf()函数时遇到很多问题之后,我决定搜索另一种方法,从键盘读取整个字符串(我所说的“整个字符串”是指混合了空格和数字等的单词,直到找到a为止)。我在stackoverflow上偶然发现了一段有趣的代码。 所以我把代码改成更动态的,我想在键盘输入字符后分配memmory。我让它工作了,但只使用char**a作为参数,在main()中,我会这样调用它read(&w)。我的想法是创建一个无参数函数,这样我就可以在每次需要读取字符串时使用它,而不必声明变量char*w。这是我得到的代码:

在使用scanf()函数时遇到很多问题之后,我决定搜索另一种方法,从键盘读取整个字符串(我所说的“整个字符串”是指混合了空格和数字等的单词,直到找到a为止)。我在stackoverflow上偶然发现了一段有趣的代码。 所以我把代码改成更动态的,我想在键盘输入字符后分配memmory。我让它工作了,但只使用
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
,这将通过NULL指针间接执行,这是一种未定义的行为

局部变量不需要额外级别的间接寻址,只需要一个参数就可以更新调用方的变量

阅读时还应检查EOF。不要使用
scanf()
,而是使用
getc()


确切地说,您的问题是什么?POSIX有一个
getline()
函数,可以满足您的需要。你能用它吗?你是想重新发明第1000个版本的
fgets
还是
getline
?使用名称
read
是一个非常糟糕的主意,因为您的平台系统库通常已经定义了这个名称。我正在尝试创建这个
read()
函数的无参数版本。我似乎无法通过所有的“*”和指针。这似乎是一个很好的实践,但我不记得
getline()
fgets()
函数。我会试试的,谢谢。
fgets()
如果数组不够长,就不会重新分配整个数组。是的,这就是为什么我建议
getline()
。哇,间接层次,不知道这一点让我觉得自己是一个完全的C新手,但谢谢@Barmar它工作得非常好。谢谢大家
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;
}