一个简单的C语言问题,scanf("%c",a+i)与scanf("%s",a+i)的区别

简单的逆向排序程序
#include<stdio.h>
#include<conio.h>
void main()
{
int i,n;
char a[100];
printf("输入字符个数:");
scanf("%d",&n);
printf("输入字符:");
for(i=0;i<n;i++)
{
scanf("%c",a+i);
}
printf("字符逆序输出:");
i=i-1;
for(;i>=0;i--)
printf("%c ",a[i]);
printf("\n");
}
输入与输出如下所示,等不到正确的结果:

把scanf("%c",a+i)改为scanf("%d",a+i)后结果就正确了

求原因!!!!!!
搞错了,是把scanf("%c",a+i)改为scanf("%s",a+i)后结果就正确了

从键盘拍入的内容,在 “键盘缓冲区”,当拍了 Enter 键(平时喊它回车键)时,键盘 缓冲区 的内容 才被 送到 “输入缓冲区”。

scanf() 读数时 是到 “输入缓冲区” 取数,“输入缓冲区” 没内容 时,scanf() 等待。

scanf("%c",a+i) 这种格式,它在缓冲区 取单个字符,空格键也好,tab 键也好, Enter 键, 字母键也好,数字键也好,遇到什么 取什么。并不跳过 “空白”
所以,输入缓冲区 有 a白b白c白d回车时,它读入的 4 个 字符 是: a 白 b 白
反序 输出 就 没有 得到 预期要 的 结果。

scanf("%s",a+i) 这种格式,读入字符串,它以空白为分隔 符。
输入缓冲区 有 a白b白c白d回车时, 它读入的 4 个 字符串 是 "a" "b" "c" "d",
依次 存放地点 是 a[i], 即a[0],a[1],a[2],a[3].
双引号括起的叫字符串,例如 "a", 它实际上 含2个字符,一个是 a, 另一个是 字符串结束符 '\0'.
由于你连续输入,存放地点只移动了1 格,所以 读入 a[1] 时,a[1] 盖去了输入 a[0]时的 字符串结束符 '\0', 同样,a[2],a[3] 盖去了输入 a[1],a[2] 时的 字符串结束符 '\0',
char a[100] 里的实际内容 变 "abcd"。
这样 你 反序 输出 就 得到 预期要 的 结果。

如果 用 scanf(" %c",a+i) 输入格式,它会自动 以空白 为 输入数据 分隔符,
拍入 a白b白c白d回车时,它会得到 abcd 。
这样 你 反序 输出 也能 得到 预期 的 结果。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-04-04
%c的时候你把空格也作为字符存起来了,所以存入数组的是a、空格、b、空格,逆向输出的时候实际输出的是空格、b、空格、a。

%s比较特殊,他被用来获取字符串,但是默认情况下遇到空格或者换行符便终止。关键是scanf不会把终止的空格符读入,所以存入数组的是a、b、c、d。
第2个回答  2014-04-04
第一个scanf()输入数据后,需要回车键结束输入状态。但是这个回车键会保留在键盘缓冲区中给下一个scanf(),在第一个scanf()下面加一条getchar();将回车键屏蔽掉就可以了。
#include<stdio.h>
#include<conio.h>
int main()
{
int i,n;
char a[100];
printf("输入字符个数:");
scanf("%d",&n);
getchar();
printf("输入字符:");
for(i=0;i<n;i++)
{
scanf("%c",a+i);
}
printf("字符逆序输出:");
i=i-1;
for(;i>=0;i--)
printf("%c ",a[i]);
printf("\n");

getchar();
return 0;
}
第3个回答  2014-04-03
%c只能输出或输入一个字符,%s输出的是一串字符还有就是char a; string s;输入的时候scanf("%c", &a);这里的&不能少,而scanf("%s",s);这里不能有&符号

scanf 应该是 scanf("%c",&a[i]),这样才对追问

我利用了指针,都一样的

追答

  我终于不用换成%s ,直接用%c来正确的解出这道题了!!

  方法是吧这个语句scanf("%c",a+i)    %c 前面加一个空格  , a空格+空格i

正确的语句


scanf("    %c",a + i);


  别把空格忘了就可以正确的做出来!这里用%s,%c都可以做出来,可是这个程序中要用%c来做!养成良好的编程风格很重要!!



举个例子:

scanf(" %c",&answer)
控制串空格用于匹配键盘缓冲区里的一个或多个空白字符(包括空格、回车、跳格等字符)。
如输入  a
说明,字符a前面有4个空格。
回车后,%c前面的空格将匹配这4个空格。
%c匹配'a', 因此此时读入到变量answer中的值为'a';
如果%c前面不加空格,同样的输入,%c匹配的将是第一个空格。



第4个回答  2014-04-03
%c 是接受字符, %d 是接受数字
第一种情况时,连续输入abcd,中间无空格,试一下追问

为什么有空格就不行了呢,用%s输入字符时中间有多少个空格都可以

追答

第一种情况时,连续输入abcd后,输出结果是否正确?

追问

正确了呀,我只是想知道为什么%c加了空格或回车就不可以,而%s加了多少个空格都可以