-1

我知道 strchr 只得到第一个实例。但是为什么我的循环不起作用。不管多少次'。或者 ' !' 或者 '?' 文中使用。一直输出3。

 //this finds number of sentences
    int Y = 0;
    while (ch != '\0');
    if(strchr(text,'.') != NULL)
        Y++;
    if(strchr(text,'!') != NULL)
        Y++;
    if(strchr(text,'?') != NULL)
        Y++;
4

2 回答 2

2

对于初学者来说,似乎有一个错字

while (ch != '\0');
                 ^^^ 

无论如何,这个代码片段

int Y = 0;
while (ch != '\0');
if(strchr(text,'.') != NULL)
    Y++;
if(strchr(text,'!') != NULL)
    Y++;
if(strchr(text,'?') != NULL)
    Y++;

没有意义,因为目标字符的搜索总是从text.

如果对每个目标符号使用函数的单独调用,则该函数strchr不适合此任务。

在这种情况下,使用此功能您需要三个单独的循环,每个目标符号一个。

这是一个演示程序,它显示了如何使用另一个字符串函数来执行该任务strcspn

#include <stdio.h>
#include <string.h>

size_t count_symbols( const char *s, const char *delim )
{
    size_t n = 0;

    while ( *s )
    {
        if ( *( s += strcspn( s, delim ) ) )
        {
            ++n;
            ++s;
        }           
    }

    return n;
}

int main(void) 
{
    const char *s = "Firt. Second? Third! That is all.";

    printf( "%zu\n", count_symbols( s, ".!?" ) );

    return 0;
}

程序输出为

4
于 2020-06-08T19:14:18.537 回答
-2
size_t count(const char *haystack, const char *needle)
{
    size_t cnt = 0;

    while(*haystack)
    {
        if(strchr(needle, *haystack++)) cnt++;
    }
    return cnt;
}

int main(void)
{
    printf("%zu\n", count("Hwedgdf,.???,,,,.h.rtfdsg....dfsdgfs?gdfg//..? //.", ".?"));
}

https://godbolt.org/z/fLUsWz

于 2020-06-08T19:16:11.697 回答