作者subeyes (嘿)
看板C_and_CPP
标题[问题] sscanf
时间Thu Jun 18 18:43:43 2009
最近在写一个程式,其中需要做下面的工作,
主要是将某个档案内依特定格式储存的资料
每一栏的资料分别存放至4个变数或阵列中,
最後输出至萤幕
举例来说,输入档的内容为:
John 4 Mary 5
Harry 8 Jason 21
那麽程式当中则分别用str1, a, str2, b四个变数来存放每一栏的资料
(即第一行中str1="John", a=4, str2="Mary", b=5,
第二行中str1="Harry", a=8, str2="Jason", b=21)
所以第一个就想到用sscanf做
以下是简化过的程式码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void){
int i;
int count=0;
char input[30];
char str1[5], str2[5];
int a,b;
while(fgets(input,25,stdin)!=NULL){
input[strlen(input)-1]='\0';
sscanf(input,"%s %d %s %d", str1, &a, str2, &b);
printf("str1=%s a=%d str2=%s b=%d\n", str1, a, str2, b);
count++;
}
return 0;
}
之所以要把每一行的'\n'改为'\0'是为了往後程式的需要。
但输出的结果却是:
str1=John a=3 str2=Mary b=4
str1= a=8 str2=jason b=21
之後将str1的长度加大就没问题了,
但还是想了解一下为什麽长度刚好的时候没办法抓到值呢? 谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.70.109.48
※ 编辑: subeyes 来自: 203.70.109.48 (06/18 18:48)
1F:推 ianfang:你哪有长度刚好 字串最後还要放'\0' 06/18 18:49
2F:→ subeyes:那麽为什麽第二列的str2还是可以顺利印出呢? 06/18 21:25
3F:推 ianfang:C不做边界检查 这是无法预期的结果 运气好罢了 06/18 22:19
4F:→ subeyes:但我试过很多次 每一次都是str1抓不到 str2抓得到 06/18 23:07
5F:→ subeyes:如果是机率问题 不是应该有时str1抓得到 有时str2抓不到? 06/18 23:08
6F:→ subeyes:sry 因为我还不太了解为什麽会这样 06/18 23:08
7F:推 VictorTom:对於这种错误的程式码造成的意外/不意外的结果.... 06/18 23:26
8F:→ VictorTom:小弟我觉得asm/memory/register拉出来自己看吧.... 06/18 23:27
9F:→ VictorTom:真有心研究的话, 是可以彻底了解运作的机制, 错误的原因 06/18 23:27
10F:→ VictorTom:以及知道为什麽明明说是机率却常常都是只有谁的问题.... 06/18 23:28
11F:→ subeyes:好的 感谢二位的解答 :) 06/18 23:30
12F:推 VictorTom:不然给您的简单的提示, 不要只看%s印出来的字串.... 06/18 23:30
13F:→ VictorTom:把str1与str2"每一个"都watch一下, 看看每一行执行完它 06/18 23:31
14F:→ VictorTom:们的变化; 比如用memory看str1与str2, 或比较'稿刚'把 06/18 23:32
15F:→ VictorTom:str1[0]~[4]与str2[0]~[4]都拉出来看一下.... 06/18 23:32
16F:→ VictorTom:因为表面上是str1[0]被覆写了'\0'所以才什麽都不印:) 06/18 23:34
17F:推 VictorTom:您想了解原因, 就要找到为什麽str1[0]被错误覆写到了. 06/18 23:36