2016-11-08 100 views
1

C代码是这样的:为什么scanf无法为输入参数赋值?

#include <stdio.h> 
#include <string.h> 

int main(void) { 
    char s[10]; 
    int i = 0, j = 0, k = 0; 

    memset(s, 0xff, sizeof(s)); 
    scanf("%9s%d%d%d", s, &i, &j, &k); 
    printf("%s,%d,%d,%d\n", s, i, j, k); 
} 

为了避免缓冲区溢出,我在scanf使用%9s。但我发现,如果输入的字符串长度小于10,结果正如我预料:

# ./test 
short 1 2 3 
short,1,2,3 

虽然长度较长或等于10ijk不能获得输入:

# ./test 
verylongstr 1 2 3 
verylongs,0,0,0 

如何理解scanf的行为?

+0

如果你分配10个字节并把12个字节存在那里,你得到的任何东西都是纯粹的巧合。你可能会遇到崩溃,或者错误的答案,或者正确的答案,或者恶魔飞出你的鼻子。一旦违反规则,编译器没有义务做任何明智的事情。 –

+0

@LeeDanielCrocker这就是使用'%9s'的全部观点,他在他的问题中解释了这一点。 – Barmar

回答

2

您告诉scanf最多可以将9个字符读入s,这就是它的功能。一旦它读取了9个字符,它会尝试将整数读入i,但下一个输入字符是t(第十个字符)。这不能转换为整数,所以扫描终止并且scanf返回1,表示它成功读取单个值。

不幸的是,你永远不会检查返回值。你应该解决这个问题。

t返回到内部缓冲区,所以下一个scanf调用将以该字符开始。

相关问题