正如标题所述,我必须添加一些东西来解释:" "/tab/","/"."
是在我的情况下划分单词的东西,另一个说明可能会有更多的单个空格或点一个接一个地出现
这就是我所拥有的
int countWords(char * str, int length){
int counter = 0;
for( int i = 0; i < length; i++){
if(( str[i] == " ") || ( str[i] == ".") || ( str[i] == ",")){
if(( str[i+1] != " ") || ( str[i+1] != ".") || (str[i+1] != ",")){
if(( str[i-1] != " ") || ( str[i-1] != ".") || (str[i-1] != ","))
counter++;
}
}
}
return counter;
}
我收到一个错误,说我无法比较int和指针,我确实知道它来自何处,但我怎样才能让它实际工作?
注意*我无法使用string.h
答案 0 :(得分:1)
在这样的表达中
str[i] == " "
^^^
您正在尝试将类型为char
的对象与隐式转换为char *
类型的字符串文字进行比较。
您必须使用字符常量而不是字符串文字
str[i] == ' '
^^^
封闭的if语句没有意义。例如,对于i
等于0,表达式str[i-1]
尝试访问字符串之外的内存。
应该使用限定符const
声明函数的第一个参数。
该功能可以按照以下方式显示,如演示程序中所示。
#include <stdio.h>
size_t countWords( const char *s )
{
size_t n = 0;
for (size_t i = 0; s[i] != '\0'; )
{
while (s[i] == ' ' ||
s[i] == '\t' ||
s[i] == '.' ||
s[i] == ',') ++i;
if (s[i] != '\0')
{
++n;
while ( s[i] != '\0' &&
! ( s[i] == ' ' ||
s[i] == '\t' ||
s[i] == '.' ||
s[i] == ',')) ++i;
}
}
return n;
}
int main( void )
{
char *s = " Hello\t, World...";
printf("%zu\n", countWords(s));
}
程序输出
2
或者函数的实现看起来像
size_t countWords(const char *s)
{
size_t n = 0;
while ( *s )
{
while (*s == ' ' ||
*s == '\t' ||
*s == '.' ||
*s == ',') ++s;
if ( *s )
{
++n;
while ( *s &&
!( *s == ' ' ||
*s == '\t' ||
*s == '.' ||
*s == ',' ) ) ++s;
}
}
return n;
}
声明该功能的更一般方法如下
size_t countWords( const char *s1, const char *s2 );
其中字符串s2
指定一组单词分隔符。
答案 1 :(得分:0)
如果你想数字,K&amp; R ANSI C就有一个很好的例子。尝试编写这样的程序。
#include <stdio.h>
#define IN 1 /* inside a word */
#define OUT 0 /* outside a word */
/* count lines, words, and characters in input */
main()
{
int c, nl, nw, nc, state;
state = OUT;
nl = nw = nc = 0;
while ((c = getchar()) != EOF)
{
++nc;
if (c == '\n')
++nl;
if (c == ' ' || c == '\n' || c = '\t')
state = OUT;
else if (state == OUT)
{
state = IN;
++nw;
}
}
printf("%d %d %d\n", nl, nw, nc);
}
希望这会有所帮助。 :)您可以找到本书here的pdf。