не в состоянии определить, почему при вызове функции происходит неправильное преобразование из char * в char - PullRequest
0 голосов
/ 03 июня 2018

ошибка: ошибка: недопустимое преобразование из 'char *' в 'char' [-fpermissive]

cout<< par(s,n1,num1,word); 

Зачем вызывать функцию par() в главном, вызывая 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;
}

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Кажется, проблема связана с объявлением 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() после метода main() имеет правильный тип для 4-го параметра, но компилятор еще не знает об этом, глядя на код внутри main().Чтобы исправить это, вам нужно настроить объявление par(), чтобы оно соответствовало реализации:

int par(char s[][80],int n1,int num1,char word[80]);

Бонус: Поскольку это C ++, а не C, вы должны предпочесть std::stringболее C-стиль char[] для любых строк.std::string проще в обращении, он всегда знает размер (в отличие от массива символов) и переполнения буфера, утечки памяти и тому подобное, что довольно часто встречается при обработке строк в стиле Cможно избежать.

0 голосов
/ 04 июня 2018

В прототипе функции par :

int par(char s[][80],int,int,char);

4-й аргумент имеет тип char , тогда как в определении функции par :

int par(char s[][80],int n1,int num1,char word[80])
{...}

4-й параметр - это массив типа char .Так что это ошибка прямо здесь.Чтобы исправить эту ошибку, вам нужно изменить 4-й параметр в прототипе функции с char на char [].

Кроме того, в теле функции par эта строка кода имеет правопосле первого, пока beg[t]=" ", это неправильно, потому что вы пытаетесь назначить строковый литерал, когда он должен быть символьным литералом.


В теле функции par у вас есть этострока кода if(strcmp(substr(temp,j,strlen(word)+2),mid)==0) здесь переменная j не определена, еще одна ошибка.

Надеюсь, это поможет.

0 голосов
/ 04 июня 2018

4-й параметр в объявлении метода par () имеет тип char.Аргумент, который вы передаете: char word[80].

...