2

我正在尝试计算 char p[] 中有多少个破折号“-”。我遍历字符串,并使用 strcmp 函数将 p[i] 位置的内容与“-”进行比较。如果它们相同,则 strcmp 函数返回 0。

int howmanyDash( char p[] ){
    int length = strlen(p);
    int i, count = 0;

    for (i = 0; i < length; i++)
    {
        if (strcmp(p[i], "-") == 0)
        {
            ++count;
        }   
    }

    return count;
    
}
int main(){
    char word[20];
    scanf("%s", word);
    int dashCount = howManyDash(word);
    printf("Dashes: %d\n", dashCount);

    return 0;
}

我得到的错误如下:警告:不兼容的整数到指针转换将'char'传递给'const char *'类型的参数;用 & [-Wint-conversion] if (strcmp(p[i], "-") == 0) 获取地址

此警告在第 7 行生成: if (strcmp(p[i], "-") == 0)

4

1 回答 1

6

该函数strcmp具有以下声明

int strcmp(const char *s1, const char *s2);

如您所见,它的两个参数都具有指针类型const char *

但是在你的程序中这个调用strcmp

if (strcmp(p[i], "-") == 0)

p[i]您提供了 type的第一个参数char。看来你想比较两个字符

if ( p[i] == '-' )

您可以使用该函数strcmp,但您必须提供一个字符串作为函数的第一个参数,例如

if ( strcmp( &p[i], "-" ) == 0 )

这个调用在语义上是正确的,但只有在指针表达式指向的字符串也表示字符串字面strcmp量的一种情况下,条件才会评估为真。在其他情况下,if 语句将评估为 false。&p[i]"-"

注意函数的参数howmanyDash应该有限定符const,因为传递的字符串在函数内部没有改变。并且没有必要使用任何标准的 C 字符串函数(尽管您可以使用标准函数strchr)。

该函数可以通过以下方式声明和定义。

size_t howmanyDash( const char s[] )
{
    size_t count = 0;

    for ( ; *s; ++s )
    {
        if ( *s == '-' )
        {
            ++count;
        }   
    }

    return count;
}

主要是你可以写

size_t dashCount = howManyDash(word);
printf("Dashes: %zu\n", dashCount);

使用函数strchr,函数howManyDash可以写成以下方式

size_t howmanyDash( const char s[] )
{
    size_t count = 0;
    const char c = '-';

    for ( ; ( s = strchr( s, c ) ) != NULL; ++s )
    {
        ++count;
    }

    return count;
}
于 2021-08-04T09:51:59.527 回答