2

以下のように char* で文字列を宣言して初期化しました。

int length;
cout<<"Enter string length: ";
cin>>length;
char* str = new char[length];
cout<<"Enter your string here:"; 
for(int i = 0;i < length;i++)
cin>>str[i];
cout<<str<<endl;

DevC++ を使用してコンパイルすると、そこに入力したものが表示されますが、Visual C++ では最後にランダムな文字を含む文字列が出力されます。Visual C++ で「こんにちは」と入力すると、「こんにちは ^^&* (Y &)」と入力されます。

4

4 に答える 4

2

文字列の末尾に null ターミネータがありません。VC++ 以外のコンパイラが何らかの形で処理していると思いますが、VC++ では、長さ + 1 文字を割り当ててから、最後の文字を '\0' に設定する必要があります。例:

char* str = new char[length + 1];

cout << "Enter your string here:"; 
for (int i = 0; i < length; i++)
    cin >> str[i];

str[length] = '\0';
于 2012-11-23T03:57:04.537 に答える
2

文字列を終了するnullではありません。length + 1文字列の末尾にヌル文字を入れる余地を与えるには、char 配列を割り当てる必要があります。

于 2012-11-23T03:55:05.403 に答える
0

文字列を終了することはありません。置くstr[length-1] = '\0';

または、より良いのは、 を割り当てる必要がありますnew char[length+1];

私見では...

于 2012-11-23T03:56:16.720 に答える
0

これを変える

for(int i = 0;i < length;i++)
    cin>>str[i];

cin>>str;

forループは必要ありません。文字ごとではなく、文字列全体を読み取ることができます。

または、文字単位で読み取りたい場合は\0cout文字列が\0.

本質的に、あなたは必要です

for(int i = 0;i < (length - 1);i++)
    cin>>str[i];

str[i] = '\0'.

length -1chars を読み取り、 で終了し\0ます。

于 2012-11-23T03:56:37.220 に答える