scanf函数永远的痛啊~~

猪头小哥 2012-02-29 04:47:12
#include <stdio.h>
int main()
{
int i ;
char a[5] ;
for(i = 0 ; i < 5 ; i++)
{
scanf("%c ",a + i) ;
}
for(i = 0 ; i < 5 ; i++)
{
printf("%c ", a[i]);
}
}


代码很简单。我要实现的功能:
输入:a b c d e
输出:a b c d e
很显然我的代码有问题,在我的基础上改改看,必须得用for循环,必须的用到参数i。这个scanf以前只知道用,一直没有好好研究它。大侠们多多指点吧。
...全文
484 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiandragon00 2012-03-01
  • 打赏
  • 举报
回复
在前面加空格
猪头小哥 2012-03-01
  • 打赏
  • 举报
回复
谢谢各位大侠了~~
#include <stdio.h>

int main(void)
{
int i ;
char a[5] ;

scanf("%c ", a + 0) ;
scanf("%c ", a + 1) ;
scanf("%c ", a + 2) ;
scanf("%c ", a + 3) ;
scanf("%c", a + 4) ; /* 还是最后的一个输入有问题,就如楼上说的,那个" "吃掉了后面所输 入的空格和我按下的enter键。*/

for(i = 0 ; i < 5 ; i++)
{
printf("%c ", a[i]);
}
printf("\n") ;

return 0 ;
}
luciferisnotsatan 2012-03-01
  • 打赏
  • 举报
回复
"%c " 这里的空格不单指一个空格,而是所有的后继空白符。空格,制表,换行都是空白符。%c后面的空格吃掉了所有的空白符

要是下面这些输入,你的代码也都能结束。
a b c d ef
-------------------
a b c d e f
-----------------------
a b c d e

f
--------------------
猪头小哥 2012-03-01
  • 打赏
  • 举报
回复
我也一直在纠结为什么
scanf("%c %c %c %c %c", a+0, a+1, a+2, a+3, a+4);

for(i = 0 ; i < 5 ; i++)
{
scanf("%c ", a + i) ; //有个空格,所以在最后输入一个字符的时候还要输入一个空格。
}

不一样?

[Quote=引用 39 楼 anyidan 的回复:]

引用 36 楼 huicpc0866 的回复:
C/C++ code

#include <stdio.h>

int main()
{
int i ;
char a[5] ;
for(i = 0 ; i < 5 ; i++)
{
if (i < 4) {
scanf("%c ", a + i) ;
} else {
……


google scanf() 的输……
[/Quote]
猪头小哥 2012-03-01
  • 打赏
  • 举报
回复
我知道,那你就用我的程序按照你的输入试试看?
[Quote=引用 23 楼 furney 的回复:]

楼主你的程序做了输入控制的,scanf("%c ", a+i)和scanf("%c", a+i)是不同的。scanf("%c ", a+i)每输入一个字符都需要再一个空格,就算最后一个输入的字符后面也需要再输入一个空格,否则你回车也是没用的。而scanf("%c", a+i)输入完指定数量的字符后直接回车程序就会继续执行。
[/Quote]
hu7324829 2012-03-01
  • 打赏
  • 举报
回复
我看我得再研究研究scanf了
EmbeddedLong 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 embeddedlong 的回复:]
引用 15 楼 zhutou100hao 的回复:
12楼的符合要求,我在这基础上改了下,没有要getch()
#include <stdio.h>

int main(void)
{
int i ;
char a[5] ;
for(i = 0 ; i < 5 ; i++)
{
scanf("%c",a+i) ;
getchar();
}
for(i = 0 ; i < ……
[/Quote]

我知道哪里了 其实 你在输入的时候scanf("%c ",a+i) ;有个空格就不行了 呵呵
AnYidan 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 huicpc0866 的回复:]
C/C++ code

#include <stdio.h>

int main()
{
int i ;
char a[5] ;
for(i = 0 ; i < 5 ; i++)
{
if (i < 4) {
scanf("%c ", a + i) ;
} else {
……
[/Quote]

google scanf() 的输入域看看,问题出在你的输入,由于你输入了一个 space, 而它留在了 缓存中

如果用
canf("%c %c %c %c %c", a+0, a+1, a+2, a+3, a+4);
可以输入
a b c d e

如果用 for(i = 0 ; i < 5 ; i++)
{
scanf("%c", a + i) ;
}
可以输入
abcde
因为每次你只读入一个 character,其余的则留在缓存中
EmbeddedLong 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zhutou100hao 的回复:]
12楼的符合要求,我在这基础上改了下,没有要getch()
#include <stdio.h>

int main(void)
{
int i ;
char a[5] ;
for(i = 0 ; i < 5 ; i++)
{
scanf("%c",a+i) ;
getchar();
}
for(i = 0 ; i < 5 ; i++)
{
printf("%c……
[/Quote]

郁闷啊,我看到的时候我就想到这个了 我在我的VC上不可以,不过粘贴你这个的时候,还可以,我就郁闷了
其实问题挺简单的,就是你按回车的时候 有个‘\n’,用于接收,c prinmer plus有讲解的 楼主基本功有待加深啊
luotuo44 2012-02-29
  • 打赏
  • 举报
回复
hk2305621_1 2012-02-29
  • 打赏
  • 举报
回复

#include <stdio.h>

int main()
{
int i ;
char a[5] ;
for(i = 0 ; i < 5 ; i++)
{
if (i < 4) {
scanf("%c ", a + i) ;
} else {
scanf("%c", a + i) ;
}
}
for(i = 0 ; i < 5 ; i++)
{
printf("%c ", a[i]);
}

while(1);
}


用个if不知道满足LZ条件不?
猪头小哥 2012-02-29
  • 打赏
  • 举报
回复
那放后面怎么不行呢?你的意思就是在程序执行前,缓存还有其他的东西?那程序执行完后,缓存里的东西没清空?
[Quote=引用 30 楼 anyidan 的回复:]

引用 26 楼 zhutou100hao 的回复:
嗯 我也想知道为什么?

引用 20 楼 jeakeven 的回复:

为什么空格在后面不行,在前面就可以


在前面可以跳过BUFFER以前残留的 white space
[/Quote]
猪头小哥 2012-02-29
  • 打赏
  • 举报
回复
试过试过~~
[Quote=引用 31 楼 anyidan 的回复:]

lz 试过 13 楼的程序吗?
[/Quote]
狂且 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 anyidan 的回复:]

C/C++ code

int i ;
char a[5] ;
for(i = 0 ; i < 5 ; i++)
{
scanf(" %c", a + i) ;
}
for(i = 0 ; i < 5 ; i++)
{
printf("%c ", a[i]);
}
[/Quote]
学习了!
AnYidan 2012-02-29
  • 打赏
  • 举报
回复
lz 试过 13 楼的程序吗?
AnYidan 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 zhutou100hao 的回复:]
嗯 我也想知道为什么?

引用 20 楼 jeakeven 的回复:

为什么空格在后面不行,在前面就可以
[/Quote]

在前面可以跳过BUFFER以前残留的 white space
狂且 2012-02-29
  • 打赏
  • 举报
回复
#include <stdio.h>

int main(void)
{
int i;
char a[5];

for(i = 0 ; i < 5 ; i++)
{
scanf("%c", a + i) ;
/********
* 没办法, 说明符就是 %c, 所以空白字符也被当成了输入字符!
* 总不能不把回车当字符吧?
* 所以要么用这种方法, 要么用其他的输入函数, 再要么就费劲的 Ctrl+Z.
**************/
}
getchar(); // ^_^
for(i = 0 ; i < 5 ; i++)
{
printf("%c ", a[i]);
}

return 0;
}
猪头小哥 2012-02-29
  • 打赏
  • 举报
回复
照你这么说,应该是先输入空格了再输入字符?
[Quote=引用 27 楼 jxnuzhouguohong 的回复:]

引用 26 楼 zhutou100hao 的回复:

嗯 我也想知道为什么?
引用 20 楼 jeakeven 的回复:

为什么空格在后面不行,在前面就可以


等待输入空格吧
[/Quote]
jxnuzhouguohong 2012-02-29
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 zhutou100hao 的回复:]

嗯 我也想知道为什么?
引用 20 楼 jeakeven 的回复:

为什么空格在后面不行,在前面就可以
[/Quote]

等待输入空格吧
猪头小哥 2012-02-29
  • 打赏
  • 举报
回复
嗯 我也想知道为什么?
[Quote=引用 20 楼 jeakeven 的回复:]

为什么空格在后面不行,在前面就可以
[/Quote]
加载更多回复(23)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧