2

私は C++ の初心者で、MSDN C++ ビギナーズ ガイドから学んでいます。

strcat 関数を試してみると機能しますが、最初に奇妙な文字が 3 つ表示されます。

これが私のコードです

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int main() {
    char first_name[40],last_name[40],full_name[80],space[1];
    space[0] = ' ';
    cout << "Enter your first name: ";
    gets(first_name);
    cout << "Enter your last name: ";
    gets(last_name);
    strcat(full_name,first_name);
    strcat(full_name,space);
    strcat(full_name,last_name);
    cout << "Your name is: " << full_name;
    return 0;
}

そして、ここに出力があります

Enter your first name: Taher
Enter your last name: Abouzeid
Your name is: Y}@Taher Abouzeid

なぜ私の名前の前に Y}@ が付くのだろうか?

4

7 に答える 7

9

最初の文字を '\0' に設定して full_name を初期化していないため、文字化け文字が含まれており、strcat を実行すると、文字化け文字の後に新しいデータが追加されます。

于 2009-12-05T22:08:21.867 に答える
5

作成している配列は、ランダム データでいっぱいです。C++ はデータ用のスペースを割り当てますが、配列を既知のデータで初期化しません。文字の配列が初期化されていない (そしてランダム データでいっぱいになっている) ため、strcat は文字列の最後 (最初の '\0') にデータを追加します。これは最初の文字にはなりません。

これは交換することで修正できます

char first_name[40],last_name[40],full_name[80],space[1];

char first_name[40] = {0};
char last_name[40] = {0};
char full_name[80] = {0};
char space[2] = {0};

これにより= {0}、最初の要素が文字列終端記号である '\0' に設定され、c++ は指定されていないすべての要素を自動的に '\0' で埋めます (少なくとも 1 つの要素が指定されている場合)。

于 2009-12-05T22:13:27.643 に答える
2

変数full_nameは、追加される前に初期化されていません。

これを変える:

strcat(full_name,first_name);

これに:

strcpy(full_name,first_name);
于 2009-12-05T22:11:04.887 に答える
1

テストで問題は見られませんがspace、唯一の文字を で初期化した後、文字列も null で終了しません' '

于 2009-12-05T22:09:58.540 に答える
0

文字列はCおよびC++ではnullで終了します(strcat関数はCのレガシーです)。これは、ランダムなメモリアドレスを指すと(新しいchar []変数が初期化されないランダムなコンテンツを持つスタックアドレスを指す)、コンパイラは最初の\ 0(null)文字までのすべてを文字列として解釈することを意味します(ポインタ演算を使用すると、割り当てられたサイズを超えます)。

これは、非常にあいまいなバグ、セキュリティの問題(バッファオーバーフローの悪用)、および非常に読み取り不能で保守不可能なコードにつながる可能性があります。最新のコンパイラには、このような問題の検出に役立つ機能があります。

ここにあなたのオプションの良い要約があります

于 2009-12-05T23:30:56.270 に答える
0

他の人が言っているように、データを初期化する必要がありますが、標準C ++ライブラリの学習について考えたことはありますか?時にはより直感的で、おそらくより効率的です。

それで:

string full_name=first_name+" "+last_name;

ヌル文字を終了する必要はありません。参考のためにcplusplusに行きます

ああ、そしてあなたがよりよく理解できるように完全に機能する例(operator + =から):

#include <iostream>
#include <string>
using namespace std;

int main ()
{
  string name ("John");
  string family ("Smith");
  name += " K. ";         // c-string
  name += family;         // string
  name += '\n';           // character

  cout << name;
  return 0;
}
于 2009-12-05T22:35:04.697 に答える
0

問題はあなたのspaceテキストにあります。

このstrcat関数には、Cスタイルの文字列が必要です。この文字列は、0文字以上の後に、ヌルの終了文字が続きます。したがって、Cスタイルの文字列に配列を割り当てる場合は、終了するヌル文字に1文字余分に割り当てる必要があります。

だから、あなたのspace array needs to be of length 2, one for the space character and one for the null character.

Since space is constant, you can use a string literal instead of an array:

const char space[] = " ";

Also, since you are a newbie, here are some tips:
1. Declare one variable per line.
This will be easier to modify and change variable types.

2. Either flush std::cout, use std::endl, or include a '\n'.
This will flush the buffers and display any remaining text.

3. Read the C++ language FAQ.
Click here for the C++ language Frequently Asked Questions (FAQ)

4. You can avoid C-style string problems by using std::string


5.スコットマイヤーズの効果的なC++およびより効果的なC++の本に投資します。

于 2009-12-05T22:43:31.893 に答える