user-0 提问: 输出最长的单词

回复:
user: user-1
content: 考虑到最长的单词可能不止一个，程序修改如下，供参考 另外，在给变量命名时最好取有点意义的名字，或者添加注释，不然回头再看或者修改这个程序，头大。。。 #include<stdio.h> #include<string.h> int n[100] = { 0 }; int i, j, s = 0, m, t, x;  int main() {     void lenthest(char a[]);     char a[100] = { 0 };      gets(a);     a[99] = '\0';      lenthest(a);      return 0; }   void lenthest(char a[]) {     int notonlyoneflag = 0;     int n[100] = { 0 };     int start[100];//开一个数组，用于记录单词的起始位置     int i, j, s = 0, m, t, x = 0;     for (j = 0, i = 0; x < strlen(a); j++)     {         for (i = x; a[i] != ' ' && a[i] != '\0'; i++)        //统计单词数             n[j] = i - x + 1;                              //将每个单词的字母数依次存放在数组n中         start[j] = x;//同步记录第j个单词在字符串中的起始位置         x = x + n[j] + 1;     }      x = j;  //总共x个单词     for (j = 0, m = n[0]; j < (x - 1); j++)              //寻找最长的单词，将其长度记录在m中     {         if (m < n[j + 1])         {             m = n[j + 1];         }     }     printf("length:%d 最长字符串为:", m);      for(i = 0; i < x - 1; i++)     {         if(m == n[i])         {             if(notonlyoneflag) printf(" 和 ");             for(j = start[i];j < start[i]+n[i]; j++)             {                 printf("%c", a[j]);                 notonlyoneflag = 1;             }          }     }     printf("\n");  }

user: user-1
content: 意思是现在已经知道最长单词是第t个单词了，那么就用s作为变量，重头浏览一遍字符串数组，从第0个单词开始意义判断t==s是否成立，如果相等，说明就是他了，输出该单词。不过又判断一遍，有点麻烦。其实上面在记录单词长度的时候就可以同时记录单词的起始位置，然后就可以直接输出了。 引用 3 楼 Schlangemm 的回复:[quote=引用 1 楼 sghcpt 的回复:] 楼主，下面代码可供参考： #include<stdio.h> #include<string.h> int n[100] = { 0 }; int i, j, s = 0, m, t, x;  int main() { 	void lenthest(char a[]); 	char a[100] = { 0 };  	gets(a); 	a[99] = '\0';  	lenthest(a);  	return 0; }   void lenthest(char a[]) { 	int n[100] = { 0 }; 	int i, j, s = 0, m, t, x = 0; 	for (j = 0, i = 0; x < strlen(a); j++) 	{ 		for (i = x; a[i] != ' ' && a[i] != '\0'; i++)		//统计单词数 			n[j] = i - x + 1;                              //将每个单词的字母数依次存放在数组n中  		x = x + n[j] + 1; 	}  	t = 0; 	x = j;                                          //将单词数即数组n中有效长度存放在x中 	for (j = 0, m = n[0]; j < (x - 1); j++)              //寻找最长的单词，并将其顺序存放在t中 	{ 		if (m < n[j + 1]) 		{ 			m = n[j + 1]; 			t = j + 1; 		} 	}  	printf("length:%d 最长字符串为:", m); 	s = 0; 	for (i = 0;  a[i] != '\0'; i++)		//查找最长单词数 	{ 		if (t == s)						//t保存着最长单词数的索引 		{ 			if (a[i] == ' ') 			{ 				break; 			}  			printf("%c", a[i]);			//输出最长单词数 		}  		if (a[i] == ' ')			 //记录多少个单词数 		{ 			++s; 		} 	} } 对最后几行有点疑问，能不能具体解释一下啊    s = 0;     for (i = 0;  a[i] != '\0'; i++)        //查找最长单词数     {         if (t == s)                        //t保存着最长单词数的索引         {             if (a[i] == ' ')             {                 break;             }              printf("%c", a[i]);            //输出最长单词数         }          if (a[i] == ' ')             //记录多少个单词数         {             ++s;         }     } }   [/quote]

user: user-2
content: 帮顶一贴！！！！

user: user-3
content: 楼主，下面代码可供参考： #include<stdio.h> #include<string.h> int n[100] = { 0 }; int i, j, s = 0, m, t, x;  int main() { 	void lenthest(char a[]); 	char a[100] = { 0 };  	gets(a); 	a[99] = '\0';  	lenthest(a);  	return 0; }   void lenthest(char a[]) { 	int n[100] = { 0 }; 	int i, j, s = 0, m, t, x = 0; 	for (j = 0, i = 0; x < strlen(a); j++) 	{ 		for (i = x; a[i] != ' ' && a[i] != '\0'; i++)		//统计单词数 			n[j] = i - x + 1;                              //将每个单词的字母数依次存放在数组n中  		x = x + n[j] + 1; 	}  	t = 0; 	x = j;                                          //将单词数即数组n中有效长度存放在x中 	for (j = 0, m = n[0]; j < (x - 1); j++)              //寻找最长的单词，并将其顺序存放在t中 	{ 		if (m < n[j + 1]) 		{ 			m = n[j + 1]; 			t = j + 1; 		} 	}  	printf("length:%d 最长字符串为:", m); 	s = 0; 	for (i = 0;  a[i] != '\0'; i++)		//查找最长单词数 	{ 		if (t == s)						//t保存着最长单词数的索引 		{ 			if (a[i] == ' ') 			{ 				break; 			}  			printf("%c", a[i]);			//输出最长单词数 		}  		if (a[i] == ' ')			 //记录多少个单词数 		{ 			++s; 		} 	} }

user: user-0
content: 引用 1 楼 sghcpt 的回复:楼主，下面代码可供参考： #include<stdio.h> #include<string.h> int n[100] = { 0 }; int i, j, s = 0, m, t, x;  int main() { 	void lenthest(char a[]); 	char a[100] = { 0 };  	gets(a); 	a[99] = '\0';  	lenthest(a);  	return 0; }   void lenthest(char a[]) { 	int n[100] = { 0 }; 	int i, j, s = 0, m, t, x = 0; 	for (j = 0, i = 0; x < strlen(a); j++) 	{ 		for (i = x; a[i] != ' ' && a[i] != '\0'; i++)		//统计单词数 			n[j] = i - x + 1;                              //将每个单词的字母数依次存放在数组n中  		x = x + n[j] + 1; 	}  	t = 0; 	x = j;                                          //将单词数即数组n中有效长度存放在x中 	for (j = 0, m = n[0]; j < (x - 1); j++)              //寻找最长的单词，并将其顺序存放在t中 	{ 		if (m < n[j + 1]) 		{ 			m = n[j + 1]; 			t = j + 1; 		} 	}  	printf("length:%d 最长字符串为:", m); 	s = 0; 	for (i = 0;  a[i] != '\0'; i++)		//查找最长单词数 	{ 		if (t == s)						//t保存着最长单词数的索引 		{ 			if (a[i] == ' ') 			{ 				break; 			}  			printf("%c", a[i]);			//输出最长单词数 		}  		if (a[i] == ' ')			 //记录多少个单词数 		{ 			++s; 		} 	} } 对最后几行有点疑问，能不能具体解释一下啊    s = 0;     for (i = 0;  a[i] != '\0'; i++)        //查找最长单词数     {         if (t == s)                        //t保存着最长单词数的索引         {             if (a[i] == ' ')             {                 break;             }              printf("%c", a[i]);            //输出最长单词数         }          if (a[i] == ' ')             //记录多少个单词数         {             ++s;         }     } }

user: user-4
content: 赞同楼上的改法 你的主要问题就是这段里面陷入了死循环，当遇到第一个空格的时候，内圈for是退出了，但是下一次到内圈for时，i直接取x的话，x里面没有算空格的计数，所以当前内圈for会判定第一个字符之后的空格，然后跳出内圈循环，如此往复进入死循环 for (j = 0, i = 0; x <= strlen(a); j++) 	{ 		for (i = x; a[i] != ' '&&a[i] != '\0'; i++)  //统计单词数 			n[j] = i + 1;                          //将每个单词的字母数依次存放在数组n中 		x = x + n[j]; 	}  其次就是你这个设计无法判定相同长度的两段字符