c - 如何创建 scanf() 的替代品

标签 c function scanf dynamic-allocation

在使用 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/

相关文章:

c - C中打印数组内容时出错

c - 数组中最小的两个整数和

c - 如何在c中使用 'cmpxchg8b'汇编指令实现原子比较和交换?

mysql - 如何复制MySQL函数?

javascript - 使用扫雷游戏的右键功能放置旗帜

c - 如何使用 scanf/sscanf 确认没有空格或尾随数据?

c - 关于系统例程: OPEN of the unix file system

javascript - 如何创建一个 OnClick 函数,当用户单击一个单词时将其更改为另一个单词?

c - 当我向 "scanf("%i", &int)"输入小数而不是整数时会发生什么?

c - scanf:内部带有宏(#define 常量)的模板