Ошибка с strcpy и его вторым аргументом - PullRequest
0 голосов
/ 11 ноября 2010

Когда я пытаюсь скомпилировать эту программу, я получаю ошибки (в том числе ниже кода) о втором аргументе strcpy.Я честно поставлен в тупик, что делать, чтобы это исправить.И я извиняюсь, если мой код не эффективен или хорош для просмотра;Я только начинающий студент CS.

#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;

int main(){   


 int r = 0;
 char *article[]={"the", "a", "one", "some", "any"};
 char *noun[]={"boy","girl","dog","town","car"};
 char *verb[]={"drove","jumped","ran","walked","skipped"};
    char *preposition[]={"to","from","over","under","on"};
    char sentence [80];

 srand(time(NULL));
 for(int i=0;i<=20;i++){

    r = (rand()%5);
 strcpy(sentence,*article[r]);
 strcat(sentence," ");
    r = (rand()%5);
 strcat(sentence,*noun[r]);
 strcat(sentence," ");
 r = (rand()%5);
 strcat(sentence,*verb[r]);
 strcat(sentence," ");
 r = (rand()%5);
 strcat(sentence,*preposition[r]);
 strcat(sentence," ");
 r = (rand()%5);
 strcat(sentence,*article[r]);
 strcat(sentence," ");
 r = (rand()%5);
 strcat(sentence,*noun[r]);
 strcat(sentence,".");
 }

 sentence[0]= toupper(sentence[0]);
 cout<<sentence <<endl;


 system("pause");
 return 0;}

1>Compiling...
1>assignment 8.cpp
1>e:\assignment 8\assignment 8\assignment 8.cpp(16) : warning C4244: 'argument' : conversion from 'time_t' to 'unsigned int', possible loss of data
1>e:\assignment 8\assignment 8\assignment 8.cpp(20) : error C2664: 'strcpy' : cannot convert parameter 2 from 'char' to 'const char *'
1>        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
1>e:\assignment 8\assignment 8\assignment 8.cpp(23) : error C2664: 'strcat' : cannot convert parameter 2 from 'char' to 'const char *'
1>        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
1>e:\assignment 8\assignment 8\assignment 8.cpp(26) : error C2664: 'strcat' : cannot convert parameter 2 from 'char' to 'const char *'
1>        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
1>e:\assignment 8\assignment 8\assignment 8.cpp(29) : error C2664: 'strcat' : cannot convert parameter 2 from 'char' to 'const char *'
1>        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
1>e:\assignment 8\assignment 8\assignment 8.cpp(32) : error C2664: 'strcat' : cannot convert parameter 2 from 'char' to 'const char *'
1>        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
1>e:\assignment 8\assignment 8\assignment 8.cpp(35) : error C2664: 'strcat' : cannot convert parameter 2 from 'char' to 'const char *'
1>        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast

Ответы [ 6 ]

6 голосов
/ 11 ноября 2010

ОПАСНО.strcat() И strcpy() являются ведущими причинами возникновения рака. Использование их подвергает вас всем видам переполнения буфера.Используйте strncat() / strncpy() или (что еще лучше) просто используйте std::string, так как вы используете C ++!

strcat() и strcpy() ожидаете, что их аргументы будут строками.*article[r] - это одиночная char - article[r] - это строка, которую вы хотите.Итак, отбросьте звездочки.

2 голосов
/ 11 ноября 2010

Ваши статьи, существительные и глаголы являются массивами указателей на символы. При выборе элемента в массиве, который вы хотите использовать, вы получаете символ * для слова для использования. Этот char * - это то, что ожидает strcpy - когда вы разыменовываете char * (т.е. article [r]), вы в конечном итоге получаете char, а не char .

Кроме того, strcpy является небезопасным строковым оператором, поэтому он может перезаписывать большие скопления памяти или иным образом открывать зияющие дыры в безопасности. Есть ли какая-то причина, по которой вам не разрешено использовать std :: string для этого назначения?

2 голосов
/ 11 ноября 2010

У вас слишком много звездочек - noun[r] уже дает char*, поэтому вам не нужно вводить дополнительный * во второй параметр.

Кроме того, strcat является небезопасной функцией и может неожиданно завершить работу вашей программы, если ваш буфер (в вашем случае sentence) слишком мал для содержимого.

Пожалуйста, используйте strncat вместо этого - вам нужно добавить еще один параметр для этой функции, который является размером буфера - в данном случае, 80. Тогда в случае недостаточного размера буфера вместо сбоя программы вы просто заметите, что ваше предложение обрезается в конце.

1 голос
/ 11 ноября 2010

вместо

 strcpy(sentence,*article[r]);

хочешь

 strcpy(sentence,article[r]);
1 голос
/ 11 ноября 2010

*article[r] - это значение типа char.Это первый символ строки.strcpy ожидает адрес строки, который просто article[r].

1 голос
/ 11 ноября 2010

Слишком много разыменований, например изменить:

strcpy(sentence,*article[r]);

до

strcpy(sentence, article[r]);

и аналогично для других экземпляров.

...