c - scanf 通过传递 char

标签 c scanf

例如,我有以下 c 代码:

printf("please input : \r\n" ) ;


char ogn, subs;

scanf("%s %s",  &ogn, &subs);

printf("the two values are: %s %s", &ogn, &subs);

运行代码时,例如我输入“abc def”并检查ogn,subs,

我只得到 ogn = "ef"和 subs = "def";

有人可以帮我解释一下吗?我知道在“字符串”情况下应该提供“字符数组”,但在这里我只想知道为什么接受用户输入的“字符”变量会导致这样的结果?

最佳答案

将指向单个 char 的指针传递给 %s 对应位置的 scanf 始终是未定义的行为,因为 %s 为字符串写入至少两个字符(字符串主体至少一个字符,以及一个空终止符)。

此外,将指向单个 char 的指针传递给 %s 对应位置的 printf 是未定义的行为,除非该 char设置为 '\0'(您的程序中并非如此)。

因此,无论您拥有什么打印输出,都很大程度上依赖于编译器。同一个程序可能会在另一台计算机上崩溃,或者产生完全不同的输出。

对于您的特定编译器,ogn 似乎位于内存中 subs 之后一个字符,因此它会打印 subs 的内容从第二个字符开始。

要解决此问题,请将至少四个字符的数组分配给字符串变量(足以容纳三个字符变量)并使用大小说明符来限制输入:

char ogn[4], subs[4]; // enough for abs def; expand if you need more chars
scanf("%3s %3s", ogn, subs);

关于c - scanf 通过传递 char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18123194/

相关文章:

c - 使用 fscanf 而不从文件中获取输入

c - 为什么我们在从 scanf 读取数据时必须按 ctrl-d ?

c - 如何从用户空间挂起 Linux 中的 i2c 设备?

c - 如何使用以下预处理器语句

c - 将 char 数组 int 值增加 1

c - 在 while 循环和重新分配期间将带有 scanf 的整数放入内存分配中

c - 如何读取未知长度的输入字符串?

c++ - C代码意外成功

c - 魔术位如何改进 glibc 中的 strlen 功能

可以在按下 enter 以外的某个特定键时终止 scanf