2015-07-17 2 views
0

Я пытался решить простую проблему, но не могу понять, почему моя программа не работает. Вы можете мне помочь? Если да, можете ли вы также объяснить мне, почему это не работает?ошибка: несовместимые типы при присвоении 'char *' to 'char [4000]'

#include <iostream> 
#include <cstring> 
#include <fstream> 

using namespace std; 
ifstream in("sirul.in"); 
ofstream out("sirul.out"); 
char a[4000]="a",b[4000]="b",aux[4000]; 
int main() 
{ int n,i; 
in>>n; 
if(n==1)out<<"a"; 
if(n==2)out<<"b"; 
for(i=3;i<=n;i++) 
{ 
    aux=strcpy(aux,b); 
    b=strcat(b,a); 
    a=strcpy(a,aux); 
} 

    return 0; 
} 
+6

Вы должны действительно рассмотреть возможность использования 'std :: string' – yizzlez

+2

Я думаю, что название вашего вопроса правильно отвечает за то, почему ваша программа не компилируется. Рассмотрите возможность использования C++ для вашей программы на C++, а не C – KABoissonneault

+0

Если вы используете * ничего больше * того, что предлагает C++, нет классов, нет шаблонов, нет ничего - * хотя бы * используйте '' и' 'insead C массивов. На самом деле нет оправдания. – DevSolar

ответ

2

strcpy и strcat работы непосредственно на указателе вы передаете в качестве первого аргумента, то и вернуться так, что вы можете звонки цепи. Таким образом, присвоение их результата обратно указателю назначения является избыточным. В этом случае это также неверно, так как вы не можете переназначить массив.

Исправление просто не присвоить возвращаемое значение этих вызовов:

strcpy(aux,b); 
strcat(b,a); 
strcpy(a,aux); 

Однако, так как вы используете C++, вы должны использовать std::string вместо этого, который дает хорошую семантику значения для ваших строк данных.

+0

Спасибо! Это решило проблему. – cronos10

0
#include <iostream> 
#include <cstring> 
#include <fstream> 

using namespace std; 
ifstream in("sirul.in"); 
ofstream out("sirul.out"); 
char a[4000]="a",b[4000]="b",aux[4000]; 
int main() 
{ 
int n,i; 
cin>>n; 
if(n==1)cout<<"a"; 
if(n==2)cout<<"b"; 
for(i=3;i<=n;i++) 
{ 
    strcpy(aux,b); 
    strcat(b,a); 
    strcpy(a,aux); 
} 

    return 0; 
} 

проверить из определения Os STRCPY, в должны быть CIN и вне должны быть COUT

1

вы не можете сделать (см 2)

char b[4000]="b"; 
char aux[4000]; 
aux /* 2 */ = strcpy(aux /* 1 */ , b); 

потому что Окс не является указателем, но массив , вы можете передать его как аргумент указателя (см. 1), но вы не можете «собрать» результат «внутри» aux (см. 2).

Как и другие, просто удалите «коллекцию», и он будет работать так, как вы ожидаете.

char b[4000]="b"; 
char aux[4000]; 
strcpy(aux /* 1 */ , b); 
// or even: 
const char *s = strcpy(aux /* 1 */ , b); 

Также вы смешиваете C и C++ в одном файле.

Также возможно наличие переполнения буфера.

+0

Почему вы говорите, что я смешал C и C++? – cronos10

+0

strcpy, strcat, строки с нулевым завершением и т. Д. - это C "вещи". Они работают на C++, но не предназначены для использования. Вместо этого используйте std :: string. (но вы не одиноки, я тоже использую это все время) – Nick

+0

Ну, я еще не изучил струны. – cronos10

Смежные вопросы