在下面的程序中,当我从键盘读取输入时,它只占用2个字符而不是4个字符,其余2个字符默认占用空格。 为什么呢???
程序通过指针 /
获取char输入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;
}
答案 0 :(得分:3)
scanf
读取格式化输入。当您录制一个数字时,您将对数字进行录音,然后按<Enter>
。因此,\n
中剩余的stdin
会在下一个scanf
中读取。如果您在字符之间按<Enter>
,则同样适用。
解决方案是在每次输入后使用标准输入流中的字符,如下所示:
#include <stdio.h>
void
clean_stdin (void)
{
int c;
while ((c = getchar ()) != '\n' && c != EOF)
;
}
另一个想法是使用fgets
来获取人力输入。 scanf
不适合此类读数。
答案 1 :(得分:0)
大部分时间scanf
读取格式化输入。对于大多数%
格式,scanf将首先读取并丢弃任何空格,然后解析指定的项目。因此,对于scanf("%d", ...
,它将接受带有初始空格(甚至是额外的换行符!)的输入而没有任何问题。
然而,其中一个例外是%c
。使用%c
,scanf会读取下一个字符,无论它是什么。如果下一个字符是空格或换行符,那就是你得到的。
根据您的具体需要,您可以在格式字符串中使用空格:
scanf(" %c",&revstring[inc]);
该空格使scanf
跳过输入中的任何空格,为您提供下一个非空白字符读取。但是,这将导致无法输入带有空格的字符串(空格将被忽略)。或者,您可以在循环之前scanf(" ");
跳过空格一次,或scanf("%*[^\n]"); scanf("%*c");
跳过所有内容直到下一个换行符,然后跳过换行符。