专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C语言

自各儿写了一段小小的程序,运行结果是…偶尔随机出错

发布时间:2011-06-28 11:29:30 文章来源:www.iduyao.cn 采编人员:星星草
自己写了一段小小的程序,运行结果是……偶尔随机出错
这个题目本来是大家都知道的《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;//当前行不是空行
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: