1

両方とも同じである 2 つの char 文字列を比較する際に問題が発生しています。

char string[50];

strncpy(string, "StringToCompare", 49);

if( !strcmp("StringToCompare", string) )
//do stuff
else
//the code runs into here even tho both strings are the same...this is what the problem is.

私が使用する場合:

strcpy(string, "StringToCompare");

それ以外の:

strncpy(string, "StringToCompare", 49);

問題は解決しますが、文字列自体を取得するのではなく、文字列の長さを挿入したいと思います。

ここで何がうまくいかないのですか?この問題を解決するにはどうすればよいですか?

4

5 に答える 5

2

終端の NUL 文字を に入れるのを忘れたstringので、strcmp が最後まで実行される可能性があります。次のコード行を使用します。

string[49] = '\0';

あなたの問題を解決するために。

于 2012-03-22T19:49:04.197 に答える
0

を使用する場合は、ヌル ターミネータを手動で設定する必要がありますstrncpy

strncpy(string, "StringToCompare", 48);
string[49] = 0;
于 2012-03-22T19:49:08.980 に答える
0

他の回答には明らかな推測がたくさんありますが、簡単な提案です。

まず第一に、記述されたコードは機能するはずです (実際、Visual Studio 2010 でも機能します)。キーは'strncpy'nullの詳細にあります。ソースの長さが宛先の長さ (この場合はそうです) よりも短い場合を除き、 暗黙的に終了文字を追加することはありません。strcpy一方null、すべての場合にターミネータが含まれており、コンパイラが関数を適切に処理していないことを示唆していますstrncpy

したがって、これがコンパイラで機能しない場合は、一時バッファを次のように初期化する必要があります。

char string[50] = {0}; // initializes all the characters to 0

// below should be 50, as that is the number of 
// characters available in the string (not 49).
strncpy(string, "StringToCompare", 50);

ただし、これは単なる例である可能性が高く、現実の世界ではソース文字列は 49 文字 (strncpyこの場合も 50 を渡す必要があります) 以上であり、この場合、NULL ターミネータは一時ファイルにコピーされません。ストリング。

std::string可能であれば、使用するコメントの提案をエコーし​​ます。これはすべてあなたに代わって処理されるため、これらのありふれた詳細ではなく、実装に集中できます。

于 2012-03-22T19:59:10.633 に答える
0

のバイト カウント パラメーターstrncpyは、文字バッファーの長さではなく、コピーするバイト数を関数に通知します。

したがって、あなたの場合、定数文字列から49バイトをバッファにコピーするように求めていますが、これはあなたの意図ではないと思います!

ただし、異常な結果が得られる理由は説明されていません。どのコンパイラを使用していますか? VS2005 でこのコードを実行すると、正しい動作が得られます。

は、バッファ長を渡す必要があるstrncpy()ため、推奨されていないことに注意してください。strncpy_s

strncpy_s (string,sizeof(string),"StringToCompare",49)
于 2012-03-22T19:59:19.790 に答える
-1

strcopyおよびstrncpy: この状況では、それらは同じように動作します!!

つまり、あなたは私たちに真実や全体像を教えてくれませんでした (例: 文字列は少なくとも 49 文字の長さです)

于 2012-03-22T19:49:39.127 に答える