从文本中读取字符串,拆分后转化成long保存进数组,但是总是一个很奇怪的错,请帮忙看一下

woshigefantong 2010-12-16 02:09:01
我的需求是这样的
从一个test.txt的文本中按行读取字符串
test.txt中的内容是这样的
1,2
3,4
5,8
我先把每行从逗号拆分成两个字符串,比如1,2被分成1和2.然后再把他们分别转换成long型数字保存进数组
下面是我的代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLINE 100
#define BUFLEN 1024
//用于保存从文件中读取的字符串
char *array[MAXLINE];
//保存转化成数字的结构,比如“1,2”转化成数字后保存为userItem[0]=1,userItem[1]=2
long userItem[10][2];
/**
字符串转化成数字
**/
long stringToNum(char *str){
long i=0,s=0;
printf("s=%s,",str);
while(*str!='\0'){
i=*str-'0';
s=s*10+i;
str++;
}
printf("s=%ld\n",s);
return s;
}

这是我的字符串分割的方法。
/**
把字符串根据逗号作为分割副,分成两端,再分别转化成long,保存到long num[2]
**/
void slip(long num[2],char str[]){
int in=0;
char *p[20];
char *buf=str;
//用“,”做分割符进行分割
while((p[in]=strtok(buf,","))!=NULL) {
buf=p[in];
in++;
buf=NULL; }

//把分割后的字符串分别转换成数字,保存进数组long num[2]
num[0]=stringToNum(p[0]);
num[1]=stringToNum(p[1]);
}


/**
从文本中读取文件,写入到字符串数组中
**/
readfileIntoCharArray(char *array[MAXLINE]){
FILE *file;
char buf[BUFLEN];
int len=0,i=0;


file=fopen("test.txt","r");
if(!file)return -1;
while(fgets(buf,BUFLEN,file))
{
len=strlen(buf);
array[i]=(char*)malloc(len+1);
if(!array[i])break;
strcpy(array[i++],buf);
}

fclose(file);

array[i]="end";
}
我的main方法


int main()
{
//读取文本,往array中读入字符闯
readfileIntoCharArray(array);

int i=0;
for(i=0;i<MAXLINE;i++){
if(array[i]=="end"){
break;
}
//把每个字符串分割后,转化成long,保存进数组userItem[i]
slip(userItem[i],array[i]);
}
}

这里我遇到了奇怪的问题
比如我的.test.txt总的数据是
1,1
1,4
2,1


可是我最后遍历userItem时候得到的数组却是类似
1,1
1,-18
2,-28
之类的数据,很奇怪,text.txt中的数据,第一列(红色的部分)都成功并且正确的转化成了对应的long类型数字,但是第二列则基本上都不正确

这个时候我就在
long stringToNum(char *str){
long i=0,s=0;
printf("传入的字符串=%s,",str);
while(*str!='\0'){
i=*str-'0';
s=s*10+i;
str++;
}
printf("处理后的结果=%ld\n",s);
return s;
}
方法中加上了红色的部分打印我的传入的*str和最后处理结果s。我得到如下结果

传入的字符串=1,处理后的结果=1
传入的字符串=1
,处理后的结果=-28
传入的字符串=1,处理后的结果=1
传入的字符串=4
,处理后的结果=2
传入的字符串=2,处理后的结果=2
传入的字符串=1
,处理后的结果=-28
传入的字符串=2,处理后的结果=2
传入的字符串=2
,处理后的结果=-18
传入的字符串=2,处理后的结果=2
传入的字符串=3
,处理后的结果=-8
传入的字符串=2,处理后的结果=2
传入的字符串=4
,处理后的结果=2
传入的字符串=3,处理后的结果=3
传入的字符串=1
,处理后的结果=-28
传入的字符串=3,处理后的结果=3
传入的字符串=3
,处理后的结果=-8
传入的字符串=4,处理后的结果=4
传入的字符串=3
,处理后的结果=-8
传入的字符串=4,处理后的结果=4
传入的字符串=5
,处理后的结果=12

观察这些结果,我发现

比如第一行数据,传入的字符串=1,处理后的结果=1。是正确的。

可是第二行数据就变成了
传入的字符串=1
,处理后的结果=-28

这里出现一个奇怪的问题,
1.莫名其妙的,多了一个换行
2.传入的字符串是1,可是处理后的结果确实-28

这到底是为什么??我哪里出错了
请高人指点
希望我问题描述的足够明白。谢谢啦。
...全文
149 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
woshigefantong 2010-12-18
[Quote=引用 7 楼 brookmill 的回复:]

即使是高手也会经常写错代码,这时候就看调试的能力了。
不管楼主用的什么编译环境,肯定有配套的调试器,看看手册或者google一下,学学怎么用。最基本的:设置断点、单步运行、查看变量值,这就足以应付80%以上的情况了。
有时候不便使用调试器,就用printf也能发现问题。比如这个程序,就在循环里加一行printf("%d ", *str); 就能看出来多了个10(也就是\n)。
[/Quote]
谢谢指导,以前是搞java的,c代码毕业以后就没写过。
需要学习的东西还很多。
谢谢啦。
回复
brookmill 2010-12-17
即使是高手也会经常写错代码,这时候就看调试的能力了。
不管楼主用的什么编译环境,肯定有配套的调试器,看看手册或者google一下,学学怎么用。最基本的:设置断点、单步运行、查看变量值,这就足以应付80%以上的情况了。
有时候不便使用调试器,就用printf也能发现问题。比如这个程序,就在循环里加一行printf("%d ", *str); 就能看出来多了个10(也就是\n)。
回复
整数直接用 atol 就是了
回复
whslovexyp 2010-12-16
Convert the string to long. You can use the API
long atol( const char *string );
回复
woshigefantong 2010-12-16
[Quote=引用 1 楼 woshigefantong 的回复:]

我如果单独使用
long userItem[2];
char str[] = "1,8";
slip(userItem,str);
测试结果总是正确的
userItem[0]=1,userItem[1]=8

但是在上面的代码中使用,userItem[1]的结果则经常出错。
这到底是为什么呢。
[/Quote]谢谢你
一下子就帮我找到了问题
我自己折腾了两个多小时
非常感谢。
回复
brookmill 2010-12-16
刚才我测试的时候不小心在test.txt里面有个空行,结果程序就崩溃了。原因是在处理空行的时候,p[0]="\n", p[1]=NULL,然后stringToNum(p[1])这里面一上来就*str,于是就挂了。
可以在stringToNum这个函数入口的地方对str做个判断看他是不是NULL
回复
brookmill 2010-12-16
fgets得到的字符串包括了换行符,所以array[0]的内容是"1,1\n",p[0]是"1"没问题,p[1]是"1\n",多了个\n,他也被stringToNum里面当作数字计算了。
while(*str!='\0'){
if (*str>='0' && *str<='9') // 把非数字的字符过滤掉
{
i=*str-'0';
s=s*10+i;
}
str++;
}
回复
woshigefantong 2010-12-16
我如果单独使用
long userItem[2];
char str[] = "1,8";
slip(userItem,str);
测试结果总是正确的
userItem[0]=1,userItem[1]=8

但是在上面的代码中使用,userItem[1]的结果则经常出错。
这到底是为什么呢。
回复
相关推荐
发帖
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
帖子事件
创建了帖子
2010-12-16 02:09
社区公告
暂无公告