C: 由于某种原因使用 fgets() 接收一个字符似乎将一个不相关的整数变量设置为 0

标签 c

我是 C 的初学者;我这样做主要是为了测试使用 fgets() 并停止使用 scanf(),但是当我在处理这段代码时,发生了一些奇怪的事情。我编译并运行了这个程序:

int main() {
    int i;
    char c;

    printf("Input an integer: ");
    scanf("%i", &i);

    printf("Number received: %i\n", i);

    getchar(); // clear '\n' from input

    printf("Input a character: ");
    //scanf("%c", &c);
    fgets(&c, 2, stdin);

    printf("Integer: <%i>\n", i);
    printf("Char: <%c>\n", c);
    return 0;
}

输入:

12
r

输出:

Input an integer: 12
Number received: 12
Input a character: r
Integer: <0>
Char: <r>

所以,我很好奇为什么将“i”设置为 0。注释 fgets() 和取消注释 scanf() 会使程序按预期工作。提前致谢。

最佳答案

线

fgets(&c, 2, stdin);

声明 &c 是指向 char 数组中的 char 的指针,至少有一个有效的 char 紧跟在 c 之后。它不是,所以你的程序有未定义的行为。

(所以任何事情都有可能发生,但看起来你的情况实际发生的是读取溢出了 c 变量并且还修改了 i 变量的一个字节,这恰好在内存中是相邻的。)

关于C: 由于某种原因使用 fgets() 接收一个字符似乎将一个不相关的整数变量设置为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46880219/

相关文章:

c - 在纯 C 中实现 RAII?

C++ 将对数组的引用传递给 C 函数

c - Node js 与 C 的比较

c - 将a-z展开为abc...xyz形式的方法

c - 指向局部指针数组的全局指针

c++ - 这个 makefile 是如何生成目标文件的?

c - 如何使用可选参数和非可选参数?

c - 为什么使用线程的程序会花费更多的时间?

c - Ruby C 扩展 : rb_funcall causing segfault

调用 "start"启动程序,调用 "stop"关闭 C 中的当前实例