怎样解决C语言TXT文本输入数据时的空格问题?

题目如下: 1到40,一共四十个数,输入时一行不超过12个数,不超过10行,筛选出现一次的数字,出现两次的数字,三次及三次以上的数字,出现零次的数字,要求用TXT文本输入,输出。
遇到的问题:输入数据后,发现结果错误。仔细查找发现,每行数据后会发现几个空格,图片说明,导致了只有第一行数据能够读入。笔者试过多次,发现貌似只有这一种空格形式会对结果造成影响,其他的情况,添加很多空格也不会有事。笔者咨询前辈,说可能由于中文或者英文状态下的原因,笔者试过两种状态下输入原数据的空格,发现均输出错误结果。现在比较迷惑,不知如何改进(其实用基本能用了),还请各位大神帮帮忙,也希望大家能对我的算法提出改进意见!
代码如下:
#include
#include
#define S 120
#define T 40
#define I 1
int main()
{
FILE*fp1;
FILE*fp2=fopen("output.txt","w");
int num1[S],num2[T],num3[T],num4[T],num5[T],num6[T],i,j=0,k=0,a=0,b=0,c=0,d=0,m,n;
if((fp1=fopen("input.txt","r"))==NULL)
{
printf("无法打开文件\n");
exit(0);
}
for(i=I;i<=T;i++)
num2[j++]=i;//将1至40赋给num2数组各元素
for(i=0;i fscanf(fp1,"%d",&num1[i]);//从文件中读出120个的数据,并存入num1数组
fclose(fp1);
for(i=0;i {
for(j=0;j if(num1[j]==num2[i])k++;//比较
if(k==0) num3[a++]=num2[i];
else if(k==1) num4[b++]=num2[i];
else if(k==2) num5[c++]=num2[i];
else if(k>3||k==3) num6[d++]=num2[i];
k=0;
}
fprintf(fp2,"出现过零次的数字是:");
for(m=0;m<a;m++)
fprintf(fp2,"%3d",num3[m]);
fprintf(fp2,"\n");
fprintf(fp2,"出现过一次的数字是:");
for(m=0;m<b;m++)
fprintf(fp2,"%3d",num4[m]);
fprintf(fp2,"\n");
fprintf(fp2,"出现过两次的数字是:");
for(m=0;m<c;m++)
fprintf(fp2,"%3d",num5[m]);
fprintf(fp2,"\n");
fprintf(fp2,"出现过三次或三次以上的数字是:");
for(m=0;m<d;m++)
fprintf(fp2,"%3d",num6[m]);
fprintf(fp2,"\n");
fclose(fp2);
return 0;
}

4个回答

使用fprintf和fscanf读取文件的时候就能防止读取进去空格了,不行的话就fread然后清空格

获取一行字符串后,先 Trim 把空格截掉

MATTHEWXUZHIYUAN
子月初七 谢谢!
5 年多之前 回复
MATTHEWXUZHIYUAN
子月初七 回复91program: 恩恩
5 年多之前 回复
MATTHEWXUZHIYUAN
子月初七 Trim是啥?太高端的我不会。。。
5 年多之前 回复
91program
91program Trim() 函数的用法,请查找一下。或直接查 MSDN。
5 年多之前 回复

我觉得我可能想的有点复杂l了,可以用链表存进去,再读到链表里,那问题就变成了链表操作~

MATTHEWXUZHIYUAN
子月初七 链表不是很会啊。。。
5 年多之前 回复
MATTHEWXUZHIYUAN
子月初七 链表不是很会啊。。。
5 年多之前 回复

解决思路:定义一个40个元素的数组int num[41] (既然只有1-40个数,为何不写死它呢,用链表太复杂),然后依次读取每行,提取数字,出现的次数直接记到数组中。
代码片段为 num[a] ++, 其中a 为从文本提取的数字。
最好输出就更容易了
for(i =1; i < 41; i++)
{
if(num[i] == 0)
printf("0 次\n");
后续代码省略
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问