这个题目本来是大家都知道的《C程序设计语言(第二版)》中练习1-18的部分,原题是:“编写一个程序,删除每个输入行末尾的空格及制表符,并删除完全是空格的行”。
编写的时候,我忽略了“删除完全是空格的行”这一要求,主要思路是:首先用子程序接受输入的字符并为字符串赋值,然后在另一个子程序中从尾部到头部对这个字符串进行检验,遇到空格和制表符跳过,从遇到的第一个普通字符开始,将每个字符内容赋值给另外一个字符串,直到字符串的第一位。最终,分别打印两个字符串和其长度。
下面是源程序。为直观起见,我尽量添加了注释。
由于是论坛新手,排版有些乱,大家见谅!
---------------------------------------------------
#include <stdio.h>
#include <string.h>
#define MAX 1000 //定义字符串的最大长度
int shuru(char juzi[], int len);//定义函数,输入整个字符串
int shanchu(char juzi1[], char juzi2[], int len1);//定义函数,删除字符串后部的空格和制表符
int shuru(char juzi[], int len)//输入字符,形成字符串的函数
{
int c,i;
for (i = 0; i < len - 2 && (c = getchar()) != EOF && c != '\n'; ++i){
juzi[i] = c;//依次输入,形成字符串
}
if (c == '\n'){//遇到回车了,说明输入结束
juzi[i] = '\0';//在字符串的最终加入结束标志
}
return i;//返回值i,表面字符串长度
}
int shanchu(char juzi1[], char juzi2[], int len)//删除字符串后部的空格和制表符的程序,juzi1是刚才输入的,juzi2是一个空的字符串,len是juzi1的长度
{
int i = len - 1;//开始检查是否为空格或者制表符的起始点:字符串的倒数第二位
while(juzi1[i] == ' ' || juzi1[i] == '\t'){//开始自后向前检查,如果是空格或者制表符的话……
i--;}//i的值就减少1,意味着继续向前检查
for(i; i >=0; i--)//终于遇到不是空格或者制表符的了,跳出上面的while,开始自后向前复制字符
(juzi2[i] = juzi1[i]) ;//从juzi1当中依次将字符复制到juzi2中
return 0;//复制完成,无需返回值
}
main()
{
int len;
char juzi[MAX];
char juzi2[MAX];
len = shuru(juzi, MAX);//利用子程序求得尾部可能含空格和制表符的字符串的长度
printf("输入的句子是:%s, 它有%d个单词。\n", juzi, len); //打印字符串
shanchu(juzi, juzi2, len);//利用子程序获得清理掉尾部空格和制表符的字符串
printf("整理后的句子是:%s, 它有%d个单词\n", juzi2, strlen(juzi2)) ;//打印字符串及其长度
}
-------------------------------------------------------
问题来了!我在测试中,输入短小的字符串如abc、abc_等,结果都是正确的,可是当输入长的字符串时,就会莫名出错。而且当我输入同样的一串字符,两次的结果还不一样,比如a-z这26个字母,两次的结果就不同(见图)。真是奇怪了啊!C语言环境我使用的是DEV C++。我是刚刚开始学的新人,请大家帮忙指点,谢谢!
------解决方案--------------------
i--;}//i的值就减少1,意味着继续向前检查
juzi2[i+1]='\0';
for(i; i >=0; i--)//终于遇到不是空格或者制表符的了,跳出上面的while,开始自后向前复制字符
加个语句就可以了。
------解决方案--------------------
仅供参考
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char ln[MAXLEN];
FILE *f;
int i,z;
int b,n,L;
int main(int argc,char **argv) {
if (argc<2) {
printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);
return 1;
}
f=fopen(argv[1],"r");
if (NULL==f) {
printf("Can not open file [%s]!\n",argv[1]);
return 2;
}
z=0;
b=0;
n=0;
L=0;
while (1) {
if (NULL==fgets(ln,MAXLEN,f)) break;
L=strlen(ln);
if ('\n'==ln[L-1]) {
if (0==z) {
for (i=0;i<L-1;i++) {
if (!(' '==ln[i]
------解决方案--------------------
'\t'==ln[i])) break;
}
if (i<L-1) z=1;//当前行不是空行
}
if (0==z) b++; else n++;
z=0;
} else {
if (0==z) {
for (i=0;i<L;i++) {
if (!(' '==ln[i]
------解决方案--------------------
'\t'==ln[i])) break;
}
if (i<L) z=1;//当前行不是空行