回复 9楼 半亩荒塘
你好,不能实现噢,比如说我输入“this is a desk“ 我的意思是,输入这个字符串,,结果显示单词数量为4,,它首先要检查前面有没有空格,然后一个一个判断,一直到‘\0’为止
#include <stdio.h> #include <string.h> void main() { char temp[100]; char out[10][20]; int i; int m = 0; int sum = 0; int flag = 0; printf("请输入待测字符串(输入回车表示结束):\n"); gets(temp); for (i = 0; temp[i] != '\0'; i++) { if (((temp[i] >= 'a') && (temp[i] <= 'z')) || ((temp[i] >= 'A') && (temp[i] <= 'Z'))) { if (0 == flag) { flag = 1; sum++; m = 0; out[sum-1][m++] = temp[i]; } else { out[sum-1][m] = temp[i]; m++; } } else { if (0 == flag) { } else { flag = 0; if (sum != 0) { out[sum-1][m] = '\0'; } } } } out[sum-1][m] = '\0'; printf("这串字符串一共有%d个单词。\n", sum); printf("他们分别是:\n"); for (i = 0; i < sum; i++) { puts(out[i]); putchar(10); } }
// 我想写一个,输入一个字符串,求里面单词个数的函数,为什么上面 // 我写的这个程序,求出的个数和实际的单词个数不一样, #include <stdio.h> #include <string.h> // 因为实现功能单一,就直接写在主函数里面了 void main() { // 变量定义 char temp[100]; // 存放待测字符串,如果输入长度大于100会出现问题, char out[10][20]; // 存放字符串中的单词,用于最后的输出,同样有问题~~如果是这 // 样定义的话就是说程序限制被测字符串含有不超过10个单词,并且 // 每个单词不能超过20个字母(其实是19个,最后一个是字符串结束符'\0')。 int i; // 字符数组下标变量 int m = 0; // 二维数组out[][]的第二个下标计数变量,第一个可以用下面的sum代替 int sum = 0; // 单词个数计数变量 int flag = 0; // 单词是否在计数中的判定变量,为1表示正在,为0则是不在,初始化为0 printf("请输入待测字符串(输入回车表示结束):\n"); // 这里就有个问题,字符串里面如果 // 有回车换行符那么是会影响结果的。 gets(temp); // 功能实现 for (i = 0; temp[i] != '\0'; i++) { // 这个循环的判定就是i++ 所以循环体里面就不出现i++了,表示执行一次循环就只判定一个 // temp的元素,这样相对简单点,不容易出错 if (((temp[i] >= 'a') && (temp[i] <= 'z')) || ((temp[i] >= 'A') && (temp[i] <= 'Z'))) { // 呃,括号有点多,只是为了判定temp是个字母 if (0 == flag) { // temp[i]是字母,那就是单词(暂时没有考虑wi1d类似这种把单词写错的情况。。) // 看看这个单词是正在计数还是还没有开始计数,flag=0表示还没有计数,这时候 // 要准备开始计数了,并把单词写入out二维数组里面 flag = 1; sum++; // flag只要是重新等于1了就说明有个新的单词,那么sum++总没错的 m = 0; // 新的单词,out里面要另起一行,从第一个开始记入单词了 out[sum-1][m++] = temp[i]; // 不要忘了m++ 我就忘了 T_T } else { // 如果flag=1,说明这个temp[i]字母是某个单词的后续 out[sum-1][m] = temp[i]; m++; // 使out二维数组记录这个单词的那一行中向后面移动一个元素,为下一个 // 单词做准备,这两行可以合并为out[sum-1][m++] = temp[i]; } }// END OF if (((temp[i] >= 'a') && (temp[i] <= 'z')) || ((temp[i] >= 'A') && (temp[i] <= 'Z'))) else { // 当temp[i]不是字母的情况 if (0 == flag) { // flag=0说明还没有开始记录单词,所以,爱咋咋地(什么都不管)。 } else { // 如果flag=1,说明前面是字母,这里不是了,也就是说这个单词结束了。 flag = 0; if (sum != 0) { // 加一个判定,这里是处理上个单词的结尾问题,如果sum=0说明还没有记入单词 // 可以不处理(就比如开头是俩空格),也就是这个if语句不执行 out[sum-1][m] = '\0'; } } }// END else OF if (((temp[i] >= 'a') && (temp[i] <= 'z')) || ((temp[i] >= 'A') && (temp[i] <= 'Z'))) &&& // END if (((temp[i] >= 'a') && (temp[i] <= 'z')) || ((temp[i] >= 'A') && (temp[i] <= 'Z'))) FOR ALL }// END OF for (i = 0; temp[i] != '\0'; i++) // for执行完毕,如果输入temp字符串有这种情况:.....you 直接完毕了,那么最后一个 // out的字母就没有字符串结束符,所以加上一个(就是原来有,加上一个也没事,除非越界) out[sum-1][m] = '\0'; // 这是结果的输出: printf("这串字符串一共有%d个单词。\n", sum); printf("他们分别是:\n"); for (i = 0; i < sum; i++) { puts(out[i]); putchar(10); } }