我遇到过很多计算单词的例子(如下面链接中的那个):
Counting words in a string - c programming
if(str[i]==' ')
{
i++;
}
和数字是:
if(str[i]>='0' && str[i]<='9')
{
i++;
}
但如果输入是“我有12个苹果”,那该怎么办?我只希望输出显示“字数= 3”?
答案 0 :(得分:2)
假设您没有包含字母数字组合的单词,例如“foo12”,那么您可以组合您的代码段,如下所示:
#include <stdio.h>
#include <string.h>
int main(void)
{
char str[] = "Bex 67 rep";
int len = strlen(str);
int count = 0, i = 0;
while(str[i] != '\0')
{
if(str[i] == ' ')
{
if(i + 1 < len && ! (str[i + 1] >= '0' && str[i + 1] <= '9') && str[i + 1] != ' ')
count++;
}
i++;
}
printf("Word count = %d\n", count + 1); // Word count = 2
return 0;
}
你循环遍历字符串的每个字符,当你找到一个空格时,你检查 - 如果你不在字符串的最后一个字符 - 如果下一个字符不一个数字或者是一个空白。如果是这种情况,那么您可以假设您遇到的空白位于单词之前,因此会增加count
。
请注意,通常情况不会以空格开头(这是此答案的额外假设),因此单词数量比count
多一个。
在现实生活中,使用strtok()
并检查每个标记的有效性,因为该方法仅用于演示,应被视为不良方法。
答案 1 :(得分:0)
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="I have 12 apples";
char * pch;
unsigned long ul;
int cnt=0;
pch = strtok (str," ,.-");
while (pch != NULL)
{
ul = strtoul (pch, NULL, 0);
pch = strtok (NULL, " ,.-");
printf("%d\n", ul);
if(ul == 0)
cnt++;
}
printf("count is %d\n", cnt);
return 0;
}
使用strtok函数解析的字符串标记。
答案 2 :(得分:0)
我的五美分。:)
#include <stdio.h>
#include <ctype.h>
size_t count_words( const char *s )
{
size_t n = 0;
const char *p = s;
while ( 1 )
{
int pos = 0;
sscanf( p, "%*[ \t]%n", &pos );
p += pos;
if ( sscanf( p, "%*s%n", &pos ) == EOF ) break;
if ( isalpha( ( unsigned char )*p ) ) ++n;
p += pos;
}
return n;
}
int main(void)
{
char s[] = "I have 12 apples";
printf( "The number of words is %zu\n", count_words( s ) );
return 0;
}
程序输出
The number of words is 3
我的建议是不要将标准函数strtok
用于此类任务。首先,它可能不处理字符串文字。它有改变原始字符串的副作用。:)