c++ - 无法确定为什么在函数调用中从 char* 到 char 的无效转换
问题描述
错误来了-错误:从 'char*' 到 'char' 的无效转换 [-fpermissive]
cout<< par(s,n1,num1,word);
为什么par()
在 main 中调用函数invalid conversion from char* to char?
自己试了很多次才找到原因。我是 C++ 的初学者。我在 par() 函数中没有发现任何问题。我没有在函数的任何地方完成赋值不匹配,我认为由于函数 par() 中提供的参数可能会出现错误
#include<iostream>
#include<string.h>
using namespace std;
int par(char s[][80],int,int,char);
char* substr(char*,int,int);
int main()
{
char s[][80]={{"this is rockstar"},{"I am rockstar"},{"the best one"},{"no one can dare"},{"rockstar rocks always"}};
char word[80]={"rockstar"};
int n1=5;
int num1=0;
cout<<par(s,n1,num1,word);
return 0;
}
int par(char s[][80],int n1,int num1,char word[80])
{
int k=0;
int length_word=strlen(word);
int t=0;
char beg[80];
while(t!=strlen(word))
{
beg[t]=word[t];
t++;
}
beg[t]=" ";
char end[80];
char mid[80];
mid[0]=' ';
t=0;
int l=1;
while(t!=strlen(word))
{
mid[l]=word[t];
l++;
t++;
}
mid[l]=' ';
t=0;
l=1;
end[0]=' ';
while(t!=strlen(word))
{
end[l]=word[t];
t++;
l++;
}
char temp[80];
while(k<n1-1)
{
int i=0;
while(s[k][i]!='\0')
{
temp[i]=s[k][i];
i++;
}
if(strcmp(substr(temp,1,strlen(word)+1),beg)==0)
{
num1+=1;
}
int tr;
for(tr=2;tr<strlen(temp)-(strlen(word)+2);tr++)
{
if(strcmp(substr(temp,j,strlen(word)+2),mid)==0)
{
num1+=1;
}
}
if(strcmp(substr(temp,strlen(temp)-strlen(word),strlen(word)+1),end)==0)
{
num1+=1;
}
k++;
}
return num1;
}
char* substr(char *s,int i, int j)
{
int pos=i-1;
static char res[80];
int k=0;
while(pos<=i+j-2)
{
res[k]=s[pos];
pos++;
k++;
}
return res;
}
解决方案
问题似乎与以下声明有关par()
:
int par(char s[][80],int,int,char);
这里的第四个参数是char
。不过里面的main()
函数就行了
cout<<par(s,n1,num1,word);
您传递声明为 的单词,char[80]
并且数组很容易衰减为 C++ 和 C 中的指针。(有关发生这种情况的解释,请参见https://stackoverflow.com/a/1328246/6710751 。)所以基本上,您正在通过一个char[]
(或char*
,指向 的指针char
),而编译器只需要char
.
当然,par()
aftermain()
方法的后续实现对于第 4 个参数具有正确的类型,但是编译器在查看内部代码时还不知道这一点main()
。要解决此问题,您必须调整声明par()
以匹配实现:
int par(char s[][80],int n1,int num1,char word[80]);
奖励:
由于这是 C++ 而不是 C,因此对于任何字符串,您应该更喜欢std::string
C 样式。更容易处理,总是知道它的大小(与字符数组不同),并且可以避免缓冲区溢出、内存泄漏等在 C 风格的字符串处理中很常见的情况。char[]
std::string
推荐阅读
- sql - 比较逗号分隔值和逗号分隔值 SQL
- python - 如何在csv_file中显示数据一字一格而不是一字一格?
- jdbc - 当新记录插入或更新数据库表中的现有记录时,如何 Hazelcast jet JDBC 继续源获取数据?
- java - 使用 Jackson 将 Java8 LocalDateTime 序列化为 UTC 时间戳
- swift - 编写一个返回自身的 Swift 函数
- javascript - 无法设置未定义的属性“道具”
- apache-camel - 用骆驼创建报告
- r - 随机选择ggtheme
- javascript - 如何从 youtube 嵌入 HTML 正则表达式嵌入 url?
- tkinter - 如何更新 tkinter 子帧类中的标签文本