user-0 提问: 自己写了一段小小的程序，运行结果是……偶尔随机出错

回复:
user: user-1
content: 复制字符串可以用strcpy,检测字符串长度可以用strlen，你的思维挺不错的，就是写的比较乱，很多细节处理地方不尽人意。多参考下经典例子有助于你养成良好的代码写作风格

user: user-2
content: 引用 4 楼 u012239887 的回复:    i--;}//i的值就减少1，意味着继续向前检查 	juzi2[i+1]='\0';     for(i; i >=0; i--)//终于遇到不是空格或者制表符的了，跳出上面的while，开始自后向前复制字符 加个语句就可以了。 同意！！

user: user-0
content: 果然是第二个字符串没有加结束符'\0'的原因。新手总是懵懵懂懂，想破了头都没找到的纰漏，老将们一眼就看透其中玄机。以后还得多跟各位师父们请教。谢谢！

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:仅供参考#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;//当前行不是空行             }         }     }     fclose(f);     if (L>0 && '\n'!=ln[L-1]) {         if (0==z) b++; else n++;//最后一行末尾无'\n'也计算     }     printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);     return 0; }   思路整齐，条理清晰，赞！

user: user-3
content: 仅供参考#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;//当前行不是空行             }         }     }     fclose(f);     if (L>0 && '\n'!=ln[L-1]) {         if (0==z) b++; else n++;//最后一行末尾无'\n'也计算     }     printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);     return 0; }

user: user-4
content: i--;}//i的值就减少1，意味着继续向前检查 	juzi2[i+1]='\0';     for(i; i >=0; i--)//终于遇到不是空格或者制表符的了，跳出上面的while，开始自后向前复制字符 加个语句就可以了。

user: user-5
content: 输出数组未初始化

user: user-6
content: 好长看起来好乱， shuru可以用gets（）+strlen（）实现，重复造轮子， shuchu可以用你那while计算出那个长度后再加个打印语句测试下，要学会测试，谁喜欢看一大坨代码，看就烦，简洁，自我测试

user: user-7
content: #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] = {0}; 	len = shuru(juzi, MAX);//利用子程序求得尾部可能含空格和制表符的字符串的长度  	printf("输入的句子是:%s, 它有%d个单词。\n", juzi, len); //打印字符串  	shanchu(juzi, juzi2, len);//利用子程序获得清理掉尾部空格和制表符的字符串  	printf("整理后的句子是:%s, 它有%d个单词\n", juzi2, strlen(juzi2)) ;//打印字符串及其长度  } 你的程序的问题是juzi2结尾没有'\0'，在利用%s输出时无法确定终点，juzi2初始化时吧每个元素都初始化为0就好了，在把juzi1中的某部分复制到2中后结尾就肯定是\0了。