char 类型的实参与 const char * 类型的形参不兼容,该怎么解决?

char 类型的实参与 const char * 类型的形参不兼容,该怎么解决?

#include<stdio.h>
#include<string.h>
int strcompare(char str1, char str2);
int main()
{
    char s1[10], s2[10];
    char* p=s1, * q=s2;
    int n, i;
    scanf_s("%s %s", p,10, q,10);
    n = strcompare(*p, *q);
    if(n==0)
        printf("%d", n);
    else
    {
        for (i = 0; i<10; i++)
        {
            if (p[i] != q[i])
            {
                printf("%d", p[i] - q[i]);
                break;
            }
        }
    }
    return 0;
}
int strcompare(char str1, char str2)
{
    
    return (strcmp(str1,str2));
}

img

就你的代码来说,要通过编译可以写
int strcompare(char str1, char str2)
修改为
int strcompare(char* str1, char* str2)

n = strcompare(*p, *q);
修改为
n = strcompare(p, q);

提供一个我写的strcompare给你参考

int strcompare(char *str1,char *str2)
{
    while (*str1!='\0'&&*str2!='\0'&&(*str1==*str2)
    {
        str1++;
        str2++;
    }
    return *str1-*str2;
}

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7787516
  • 你也可以参考下这篇文章:【C++错误】“const char *“ 类型的实参与 “char *“ 类型的形参不兼容错误的解决方法
  • 除此之外, 这篇博客: 指针字符串 与 const char * 即const * char 的详细使用讲解中的 指针字符串的使用问题 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述
    一、直接定义字符串指针的使用注意事项

    1. 定义字符串指针的时候 const char *, 和字符串本身相同,就不会出现警告
    2. const char * == char const *,
    3. 作用:const char * p ,表示的是指针p指向的数值不能修改, 但是可以通过本身自己去修。
    4. 不能通过指针修改指针对应的数值,但是其对应的数值,可以通过本身修改

    二、会出现警告的版本,能正常输出,但是不能修改

    int main()
    {
        char *str = "hellow"; 
        cout << str << endl;
        return 0;
    }
    

    输出结果
    在这里插入图片描述
    虽然左边是char * 类型,但是无法修改的版本

    int main()
    {
        char *str = "hellow"; 
        str[2] = 'a';
        cout << str << endl;
        return 0;
    }
    

    三、可以修改的版本

    int main()
    {
        char s2[] = "world";
        char *p = s2;
        *p = 'a';
        cout << s2 << endl;
        return 0;
    }
    
    1. 先必须确定右边的字符串放入字符数组中
    2. 然后才可以修改。

    四、关于const char * 使用测试

    int main()
    {
        char s[] = "hellow";
        const char *p = s;
        cout << p << endl;  //输出 hellow
        // *(p) = 'f';  //错误:向只读位置赋值
        // cout << p << endl;
        s[0] = 'f';
        cout << p << endl;//输出 fellow
        return 0;
    }
    
    1. const char * 表示 不能修改 指针 指向的 地址的 内容
    2. 但是地址是可以 改变的, 参照第五条对比
    3. 但是可以通过本身进行修改

    五、char * const

    int main()
    {
        char s[] = "hellow";
        char * const p = s;
        char s2[] = "good";
        // p = s2; //错误:向只读变量‘p’赋值
        p[0] = 'f';
        cout << p << endl; //fellow
        return 0;
    }
    
    1. 表示 指针p指向的 地址 是 无法改变的
    2. 至于 指向的 地址 所存放的内容 是可以 改变的
    3. 可以对比 const char *
    int main()
    {
        char s[] = "hellow";
        const char *  p = s;
        char s2[] = "good";
        p = s2;
        cout << p << endl; //good
        return 0;
    }
    

    参照:
    1、https://blog.csdn.net/SilentOB/article/details/76994618
    【const char * 、char const *、 char * const 三者的区别】

  • 以下回答由chatgpt基于相关博客总结生成:

    针对这个问题,可以采取以下几种解决方案: 1. 将char类型实参强制转换成const char *类型形参,可以通过类型转换来解决类型不兼容的问题。如下:

    void testfunc(const char *teststr)
    {
        char *temp;
        temp = (char *)teststr;
    
        printf("before change, the teststr is : %s\r\n", teststr);
    
        temp[1] = 'C';
    
        printf("after change, the teststr is : %s\r\n", teststr);
    
        return;
    }
    

    这里在将teststr赋值给临时变量temp时,进行了类型转换,将const char 类型转换为char 类型,使得在修改temp内容时不会出现类型不兼容的问题。

    1. 将实参改成char *类型,这种方法相对简单,不需要进行类型转换,但是需要注意传入的参数是否允许修改。如下:
    void testfunc(char *teststr)
    {
        char *temp;
        temp = teststr;
    
        printf("before change, the teststr is : %s\r\n", teststr);
    
        temp[1] = 'C';
    
        printf("after change, the teststr is : %s\r\n", teststr);
    
        return;
    }
    
    int main()
    {
        char teststr[20] = "hello world.";
    
        testfunc(teststr);
    
        return 0;
    }
    
    1. 将形参改成char const *类型,即指针指向的内容不可修改,这种方法可以避免使用类型转换,同时保证指针指向的内容不被修改,如下:
    void testfunc(char const *teststr)
    {
        //char *temp;
        //temp = teststr;
        //会报错,因为指针指向的内容不可修改
    
        printf("before change, the teststr is : %s\r\n", teststr);
    
        //temp[1] = 'C'; //也会报错,因为指针指向的内容不可修改
    
        printf("after change, the teststr is : %s\r\n", teststr);
    
        return;
    }
    
    int main()
    {
        char teststr[20] = "hello world.";
    
        testfunc(teststr);
    
        return 0;
    }
    

    这里需要注意的是,需要使用char const 类型,不能直接使用const char 类型,否则编译器会报类型不匹配的错误。