作者rex6608kevin (silence)
看板b98902HW
标题[计程]单班2008考古题-2.String Connection碰到的一点问题
时间Mon Nov 9 03:38:02 2009
原本想说做完这题就去睡觉,结果卡题卡了一小时,囧。
原因就是我碰到奇怪的读入行数问题了...
请教一下强者跟有爱心的同学救救我...不知道有没有人可以告诉我原因
(附上测资,说明我碰到的问题。)
3 <---先输入一个数决定底下要输入多少字串
abc <---字串一
bcdef <---字串二
g <---字串三
第一种读入法:
int count,i;
char s[1000][1000];
scanf("%d",&count);
for(i=0;i<count;i++) gets(s[i]);
乍看平凡无奇,原本以为这只是基础中的基础,
但是这样子做却只会读入两行字串而非三行!?莫非是我基础太差?(死)
(知道是两行的原因是我在回圈中加入printf去debug)
几经上网搜寻我得到了一个很莫名的解:
在scanf下面加入一行fflush(stdin) (虽然更深入去找文章之後知道这样做不好)
就可以正确的读入三行字串了。
但是缓存区的问题毕竟不是课程上有提到的,是不是有更好的解决方法呢?
於是乎我又去做了一些尝试:
int count,i=0;
char s[1000][1000];
scanf("%d",&count); //我把这行当作垃圾资料
while(gets(s[i])!=NULL)i++;
这次竟然跑不出东西来了OTZ,会变成一直要我输入东西的回圈...
会这样写是因为我在写ZeroJudge的时候常常写
while(scanf("%d",&a)!=EOF)i++;想去如法炮制,结果失败了。
结果我想到了某次上课练习,某题助教说不要用gets用scanf,於是我又换了scanf:
int count,i;
char s[1000][1000];
scanf("%d",&count);
for(i=0;i<count;i++)
{
scanf("%s",s[i]);
}
经过多次尝试,这次终於过关了,总算获得了AC。
AC是AC了,但是心中始终对gets有个疙瘩,於是乎半夜不睡觉跑去大陆论坛翻翻。
上面写道:
第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在
缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
第二:为了避免出现上述问题,必须要清空缓冲区的残留数据
看完真是收获很多,收获了很多问题在心头...
这时我有了以下的问题:
(1)scanf在读入字串的时候会不会在最後放下'\0'?
(2)用一个char array配回圈让getchar()读入字元,那最後会不会放下'\0'?
(3)gets要让他停应该是NULL吗?(第四次小考我写了!=NULL获得了AC,但是这边失败了)
(4)上文提到的scanf不会舍弃回车符(enter)根据我实验的结果printf还是要\n才换行
如果(1)成立的话表示最後enter space tab 都会变成中断点'\0'的意思吗?
问题太多伤眼睛ˊˋ半夜找不到人问,不知道有没有好心人可以告诉我答案呢?
快要考试了好紧张...我已经四次小考0分了
如果不加紧抢分大概这学期要科科了...
--
███████麦面█◤█████ ███ ██◢███◣█◥◣█ █ ██
█████████◤█ ★█‧–●– ███◢████ █ ██ ██
█████禾斗█◤ 干你妈的 ▂≡▂ ▕ ◤‧ ██
███████◤ ‧ 快去买来吃! ▎ -⊙-⊙— ▍ ‧ ██
███禾斗█◤ ★ ◣ █▏ /皿\ ▋ ██
█████◤█★ █◣◣︶ ▊ ψQSWEET ★ ██
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.240.134
※ 编辑: rex6608kevin 来自: 140.112.240.134 (11/09 03:40)
※ 编辑: rex6608kevin 来自: 140.112.240.134 (11/09 03:42)
1F:推 paugoo:wew...为什麽我还是写不出来???我一开始也是用gets(i) 11/09 03:43
2F:→ paugoo:不知为什麽就是会少一串...所以我也改用scanf了... 11/09 03:45
3F:→ paugoo:可是还是没过关...真可恶 11/09 03:46