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));
}
就你的代码来说,要通过编译可以写
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;
}
一、直接定义字符串指针的使用注意事项
二、会出现警告的版本,能正常输出,但是不能修改
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;
}
四、关于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;
}
五、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;
}
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 三者的区别】
针对这个问题,可以采取以下几种解决方案: 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内容时不会出现类型不兼容的问题。
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;
}
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 类型,否则编译器会报类型不匹配的错误。