0

このプログラムをコンパイルしようとすると、strcpyの2番目の引数に関するエラー(コードの下に含まれています)が表示されます。私はそれを修正するために何をすべきか正直に困惑しています。そして、私のコードが効率的でないか、見栄えが悪い場合は申し訳ありません。私は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
4

6 に答える 6

6

危険。strcat()そしてstrcpy()、コードガンの主な原因です。それらを使用すると、あらゆる種類のバッファオーバーフローが発生します。C ++を使用しているので、strncat()/を使用するstrncpy()か、(さらに良い)単にを使用してください。std::string

strcat()引数が文字列であることをstrcpy()期待します。*article[r]は単一ですchar-article[r]必要な文字列です。したがって、先頭のアスタリスクを削除します。

于 2010-11-11T19:45:36.237 に答える
2

アスタリスクが 1 つ多すぎます -noun[r]すでに が与えられているため、2 番目のパラメーターにchar*追加する必要はありません。*

また、strcat安全でない関数であり、コンテンツに対してバッファー (この場合はsentence) が小さすぎると、プログラムが予期せずクラッシュする可能性があります。

代わりに を使用してくださいstrncat。その関数にもう 1 つのパラメーター (バッファー サイズ) を追加する必要があります。この場合は80. 次に、プログラムのクラッシュではなくバッファのサイズが小さい場合、文が最後で切り取られていることに気付くだけです。

于 2010-11-11T19:46:10.480 に答える
2

冠詞、名詞、および動詞は、char ポインターの配列です。使用する配列内の項目を選択すると、使用する単語への char* が取得されます。この char* は strcpy が期待するものです。 char* (つまりarticle[r]) を逆参照すると、 char ではなく char になります。

また、strcpy は安全でない文字列演算子であるため、大きなメモリの塊を上書きしたり、大きなセキュリティ ホールを開いたりする可能性があります。この割り当てに std::string を使用できない理由はありますか?

于 2010-11-11T19:47:44.770 に答える
1

逆参照が多すぎます。たとえば、次のように変更します。

strcpy(sentence,*article[r]);

strcpy(sentence, article[r]);

他のインスタンスについても同様です。

于 2010-11-11T19:46:22.603 に答える
1

*article[r]タイプの値ですchar。文字列の最初の文字です。strcpy単純にarticle[r].

于 2010-11-11T19:46:57.580 に答える
1

それ以外の

 strcpy(sentence,*article[r]);

あなたが欲しい

 strcpy(sentence,article[r]);
于 2010-11-11T19:47:21.183 に答える