回复 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);
}
}
