「已注销」
2015-01-13 10:12
采纳率: 100%
浏览 4.5k
已采纳

怎样解决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条回答 默认 最新

  • codeLeaves 2015-02-01 02:55
    已采纳

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

    已采纳该答案
    打赏 评论
  • 91program 2015-01-13 10:22

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

    打赏 评论
  • Dove88888888 2015-01-13 11:37

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

    打赏 评论
  • thomashtq 2015-01-30 01:35

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

    打赏 评论

相关推荐 更多相似问题