例如,我有以下 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/