scanf用空格获取两行输入

时间:2012-10-03 09:08:41

标签: c scanf

请找到以下代码,例如

main()
{
    int i;
    char s[100];
    printf("Enter the string \n");
    scanf(" %s ",s);
    printf("Enter the string\n");
    scanf("%d",&i);
    printf("%s\n%d\n",s,i);
}

上述代码的输出是

Enter the string 
hai
hai
Enter the string
hai
0

它应该接受一行输入但它也接受第二行。
如果删除了scanf中的空格,则输出正确。

任何人都可以解释一下吗?

当使用相同的整数(%d)时,它不会发生。这是用字符串发生的。

5 个答案:

答案 0 :(得分:1)

我们的第一个scanf等待一个包含空格的字符串,但是没有。所以它要求你输入字符串并在第二次被接受,因为你在输入新字符串之前键入[enter]。 [enter]在scanf中被视为空格。

请参阅此链接,它似乎相同

Explain what is difference between without whitespace in scanf and with whitespace in scanf?

答案 1 :(得分:1)

您的第一个scanf要求输入一个字符串,并且会跳过前导空格 您的第二个scanf要求提供 整数

当您输入"hai"时,它会进入s[]。它与" hai"相同,只保留"hai" 当您输入"jai"时,它会被解析为int,从而为您提供零。

除了第二个printf

之外,你的程序没有任何问题
printf("Enter an integer\n");

答案 2 :(得分:1)

来自scanf()的手册页:

  

一系列空格字符(空格,制表符,换行符等;请参阅   isspace为(3))。该指令匹配任意数量的空白区域,   包括无,在输入中。

如果格式字符串中有空格,则会跳过输入中的任意数量的空白字符。这意味着你 必须输入非空格字符,以便继续读取字符串s

在C / POSIX语言环境中,空格字符可以是:

  

空格,换页('\ f'),换行符('\ n'),回车符('\ r'),   水平制表符('\ t')和垂直制表符('\ v')。

答案 3 :(得分:0)

“%s”中不应有空格 判刑两次的原因是你写了两次

答案 4 :(得分:-1)

main()
{
    int i;
    char s[100];
    printf("Enter the string \n");
    scanf("%c", &s);
    fgets(s, 100, stdin);
    printf("Enter the string\n");
    scanf("%d",&i);
    printf("%s\n%d\n",s,i);
}

fgets会让c获得许多字符。