1

在下面的程序中,当我从键盘读取输入时,它只占用 2 个字符而不是 4 个字符,其余 2 个字符默认占用空格。为什么???

通过指针获取字符输入的程序/

int c,inc,arrysize;
char *revstring;
printf("enter the size of char arry:");
scanf("%d",&arrysize);
revstring = (char *)malloc(arrysize * sizeof(*revstring));
printf("%d",sizeof(revstring));
printf("enter the array elements:");
for(inc=0;inc<arrysize;inc++)
{
scanf("%c",&revstring[inc]);

}
for(inc =0;inc<arrysize;inc++)
    printf("%c",revstring[inc]);
getch();
return 0;

}

4

2 回答 2

3

scanf读取格式化的输入。当您录制一个号码时,您录制了数字,然后按<Enter>。所以有一个剩余\n的 in stdin,在 next 中被读取scanf。如果您<Enter>在字符之间按,这同样适用。

一种解决方案是在每次输入后使用标准输入流中的字符,如下所示:

#include <stdio.h>

void
clean_stdin (void)
{
  int c;

  while ((c = getchar ()) != '\n' && c != EOF)
    ;
}

另一个想法是用来fgets获取人工输入。scanf不适合这样的读数。

于 2013-02-11T17:40:56.247 回答
0

大多数时候scanf读取格式化的输入。对于大多数%格式,scanf 将首先读取并丢弃任何空格,然后解析指定的项目。因此,scanf("%d", ...它将毫无问题地接受带有初始空格(甚至是额外的换行符!)的输入。

然而,例外之一是%c。使用%c, scanf 读取下一个字符,无论它可能是什么。如果下一个字符是空格或换行符,那就是你得到的。

根据您到底想要什么,您可以只在格式字符串中使用空格:

scanf(" %c",&revstring[inc]);

空格会导致scanf跳过输入中的任何空格,从而为您提供下一个读取的非空格字符。但是,这将导致无法输入包含空格的字符串(空格将被忽略)。或者,您可以scanf(" ");在循环之前跳过空格一次,或者scanf("%*[^\n]"); scanf("%*c");跳过所有内容到下一个换行符,然后跳过换行符。

于 2013-02-11T19:08:11.130 回答