题目:字符串处理
文本文件 num1.txt 和 num2.txt 中各有一组用空格分隔的整数,将 num1.txt
和 num2.txt 联合排序,并将结果保存在 num3.txt 中,例如图1 所示。
图 1
举例:
a) num1.txt
b) num2.txt
c) num3.txt
这是大一的一道程序设计题,题目本身并不是很难。
下面是思路:
1.先读取两个文件,将两个字符串都转化为数字数组
2.将两个数组合并且排序
3.将数字数组转化为字符串且写入文件
根据思路,先写出main函数并声明需要用到的函数
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//读取文件
void readText(char strNumb[]);
//将字符串转化为数字数组并计数
int tranToNumb(char strNumb[],int intNumb[]);
//合并
void toOneArray(int intNumbSum[],int intNumb1[],int intNumb2[],int count1,int count2);
//排序
void sort(int intNumbSum[],int countSum);
//将数字数组转化为字符串
void tranToString(int intNumbSum[],char strNumbSum[],int countSum);
//写入文件
void writeText(char strNumbSum[]);
int main(void){
//文件字符串与转化后的数字数组
char strNumb1[1000]="num1.txt",strNumb2[1000]="num2.txt";
int intNumb1[100]={0},intNumb2[100]={0};
//计数
int count1=0,count2=0;
//整合后的数字数组
int intNumbSum[200]={0};
//转化为字符串写入文件
char strNumbSum[2000]={0};
//读取文件
readText(strNumb1);
readText(strNumb2);
//将字符串转化为数字数组并计数
count1=tranToNumb(strNumb1,intNumb1);
count2=tranToNumb(strNumb2,intNumb2);
//合并
toOneArray(intNumbSum,intNumb1,intNumb2,count1,count2);
//排序
sort(intNumbSum,count1+count2);
//将数字数组转化为字符串
tranToString(intNumbSum,strNumbSum,count1+count2);
//写入文件
writeText(strNumbSum);
}
再根据要求写函数内容
1.读取文件
将文件内容转化为程序中字符串
//读取文件
void readText(char strNumb[]){
//定义文件指针,只读文件
//上面将字符串初始化为了打开的文件名
FILE *fp=fopen(strNumb,"r");
//清空
memset(strNumb,'\0',sizeof(strNumb));
//读取文件
fgets(strNumb,1000,fp);
}
2.将字符串转化为整型数组并计算有效数字多少
这也是这道题唯一较难的点,也可以不使用atoi函数,直接采用(‘字母’-‘0’)的方式也可以转化为数字
//将字符串转化为数字数组并计数
int tranToNumb(char strNumb[],int intNumb[]){
int count=0;
char temp[10]={0};
int i=0,j=0;
while(strNumb[i]!=EOF&&strNumb[i]!='\0'&&strNumb[i]!='\n'){//非终止符
while(strNumb[i]!=' '){//空格前暂存为一个字符串
if(strNumb[i]==EOF||strNumb[i]=='\0'){//最后一个数字
break;
}
temp[j++]=strNumb[i++];
}
if(strNumb[i]==' '||strNumb[i]==EOF||strNumb[i]=='\0'){//空格结算一次
intNumb[count++]=atoi(temp);//将暂存的字符串用arrayToInt函数转为数字
//清空,位移到下一位
j=0;
i++;
memset(temp,'\0',sizeof(temp));
}
}
return count;
}
3.合并
//合并
void toOneArray(int intNumbSum[],int intNumb1[],int intNumb2[],int count1,int count2){
int i;
for(i=0;i<count1+count2;i++){//整合
if(i<count1){
intNumbSum[i]=intNumb1[i];
}
else{
intNumbSum[i]=intNumb2[i-count1];
}
}
}
4.排序
冒泡算法
//排序
void sort(int intNumbSum[],int countSum){
int i,j;
int temp=0;
//引入数字个数,进行冒泡排序
for(i=1;i<countSum;i++){
for(j=0;j<countSum-i;j++){
if(intNumbSum[j]>intNumbSum[j+1]){
temp=intNumbSum[j];
intNumbSum[j]=intNumbSum[j+1];
intNumbSum[j+1]=temp;
}
}
}
}
5.将数字数组转化为字符串
//将数字数组转化为字符串
void tranToString(int intNumbSum[],char strNumbSum[],int countSum){
int i;
char temp[100]={0};
for(i=0;i<countSum;i++){
//intToArray(int,char,radix进制)函数,转化为字符串
itoa(intNumbSum[i],temp,10);//10进制
//将字符串temp接到strNumbSum之后
strcat(strNumbSum,temp);
strcat(strNumbSum," ");
}
}
6.写入文件
//写入文件
void writeText(char strNumbSum[]){
//定义文件指针,只写文件
FILE *fp=fopen("num3.txt","w");
//写入文件
fputs(strNumbSum,fp);
}
运行效果:
运行后:
总结与思考:
这是在暑假期间重新写的,原先在学校写的交上去的作业,有的函数甚至超过了70行,重复代码太多,比如写了两个函数来打开文件,而且还有一些类似于定义了count[1]这种一个单位的数组。
更改后减少了至少一半的代码,但我在写的过程中,似乎想到了更为简单的方法,因为字符串的拼接更为简单——只需要一个strcat函数,是否可以先让两个字符串拼接,然后再转化为整型数组进行排序,这个改动应该不是很难。
还有没有什么更简单的方法呢?