如何使用scanf获取输入以包含空间

时间:2014-03-24 10:29:57

标签: c scanf space

我是C的新手,这是我一直困惑的事情 让我们说我有这样的代码 我只想使用char

    char a, b, c;
    printf("input first character: ");
    scanf(" %c", &a);
    printf("input second character: ");
    scanf(" %c", &b);
    printf("input thrid character: ");
    scanf(" %c", &c);

我多么希望能够在太空中阅读;我注意到这只会在非空格字符中读取,如果我想读取空格以及类似这样的内容,那该怎么办? &#39 ;;我该如何扫描这个空间;

现在通过听取使用getchar()的建议我写了这个:

#include<stdio.h>

int main(void)
{
  char a,b,c;
printf("input the first char:");
a=getchar();
printf("input the second char:");
b=getchar();
printf("input the third char:");
c=getchar();
 return 0;


}

当我编译并运行程序

时,会发生什么奇怪的事情

程序输出就像这样

input the first char:
input the second char:input the third char:

现在它永远不会让我输入第二个字符,它直接跳到第三个请求结尾我只被要求输入2个输入,这很奇怪,因为程序明确要求代码中的3个。

现在这是我写的一个程序,我在代码块中添加了建议

int main(void)
{
    int totalHeight=0, floorWidth=0, amountOfStories, amountWindowForTop, amountWindowForMiddle, amountWindowForBottom, windowHeight, middleWindowWidth, topWindowWidth, bottomWindowWidth, minimumHeight, minimumWidth;
    int betweenDistanceTop, betweenDistanceMiddle, betweenDistanceBottom, edgeDistanceTop, edgeDistanceBottom, edgeDistanceMiddle;
    char topFloorWindowContent, middleFloorWindowContent, bottomFloorWindowContent, windowBorder, floorBorder;
    int tempMax, tempValue, tempSideDistance, tempBetweenDistance;
    printf("please enter how many stories your building would like to have: ");
    scanf("%d",&amountOfStories);
    minimumHeight=amountOfStories*6+1;
    while((totalHeight<minimumHeight)||((totalHeight%amountOfStories)!=1))
    {
        printf("please enter the totalHeight (minimum %d): ",minimumHeight);
        scanf("%d",&totalHeight);
    }
    printf("please enter how many window building would have for top floor: ");
    scanf("%d",&amountWindowForTop);
    printf("please enter how many window building would have for middle floors: ");
    scanf("%d",&amountWindowForMiddle);
    printf("please enter how many window building would have for bottom floor: ");
    scanf("%d",&amountWindowForBottom);
    tempMax=amountWindowForTop;
    if (tempMax<amountWindowForMiddle)
    {
        tempMax=amountWindowForMiddle;
    }
    if (tempMax<amountWindowForBottom)
    {
        tempMax=amountWindowForBottom;
    }
    while(floorWidth<tempMax)
    {
        printf("please enter the width of the building (Minimum %d): ",tempMax*4+1);
        scanf("%d",&floorWidth);
    }

    char a, b, c;


    printf("a:");
    a=getchar();getchar();
    printf("b:");
    b=getchar();getchar();
    printf("c:");
    c=getchar();
    printf("a=%c, b=%c, c=%c", a, b, c);
return 0;
}

现在这里是有趣的部分,如果我把这个代码块放在大程序中它没有工作输出是这样的

please enter how many stories your building would like to have: 2
please enter the totalHeight (minimum 13): 2
please enter the totalHeight (minimum 13): 2
please enter the totalHeight (minimum 13): 13
please enter how many window building would have for top floor: 2
please enter how many window building would have for middle floors: 2
please enter how many window building would have for bottom floor: 2
please enter the width of the building (Minimum 9): 9
a:
b:*
c:a=
, b=
, c=

因为我们可以看到b c全部读入\ n而不是空格*而c甚至没有读过任何内容为什么会这样?

5 个答案:

答案 0 :(得分:0)

您应该使用getchar()

a = getchar();

答案 1 :(得分:0)

scanf在您提供任何数据之前不会扫描任何内容,因此扫描“char”无效。

为此你必须使用getchar()fun for char或gets()for string,它将扫描数据直到你输入。即使你没有提供任何字符或简单的“char”,它也会出现。

答案 2 :(得分:0)

如果你想阅读有空格的角色,那么你可以使用gets()功能。

char str[10];

str=gets();

答案 3 :(得分:0)

尝试scanf(“%c”,&amp; ch)。 如scanf格式说明符中所述:

“空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空格字符(空白字符包括空格,换行符和制表符 - 请参阅isspace)。格式字符串中的单个空格验证任何数量从流中提取的空白字符(包括无)。“

getchar()获得意外结果,因为在Windows中,换行符(当你在控制台中按Enter键时)是两个字符。

答案 4 :(得分:0)

您的代码存在以下问题:当您读取第一个字符(a)时,按Enter(\n)以插入下一个字符,现在stdin处是\n,你还没有被淹没。当您尝试读取下一个字符(b)时,程序会从\n读取前一个stdin,并且不允许您读取下一个字符。因此,当您使用getchar()阅读字符,然后按键盘上的Enter键时,您需要第二个getchar()来删除\n。 以下是可以解决您的问题的示例代码:

#include<stdio.h>

int main(void) {
  char a, b, c;

  printf("a:");
  a=getchar();getchar();
  printf("b:");
  b=getchar();getchar();
  printf("c:");
  c=getchar();
  printf("a=%c, b=%c, c=%c", a, b, c);
  return 0;
}

对于你发布的编辑,你需要把所谓的&#34; stdin清洁器&#34;在获取abc

的值之前
while(getchar()!='\n');

它只是将所有角色重新移动到\n。 请注意,当您发布的程序有很多来自键盘的输入时,有时您会遇到此问题,因为stdin中有额外的字符。所以这个问题的一般答案是试图弄清楚这些额外的字符(大多数在某处有一个额外的\n)可以使用像我提到的那样删除的功能,以便你可以继续阅读stdin