0

私はC++で始めたばかりなので、ここでばかげた間違いをしているかもしれません。以下は私のコードとコメントの出力です。私はXcodeを使用しています。

#include <iostream>
#include <string.h>

using namespace std;

 int main() {

          char myString[] = "Hello There";
          printf("%s\n", myString);

         strncpy(myString, "Over", 5); // I want this to print out "Over There"

         cout<< myString<<endl; // this prints out ONLY as "Over"

         for (int i = 0; i <11; i++){
         cout<< myString[i];
          }// I wanted to see what's going on this prints out as Over? There
          // the ? is upside down, it got added in

         cout<< endl;
         return 0;
}
4

3 に答える 3

1

問題

  • strncpy (destination, source, max_len)

strncpyは、最初のバイト内にヌルバイトが含まれていない場合、末尾のヌルバイトを含め、最大からまでのmax_len文字をコピーするように定義されています。sourcedestinationsourcemax_len

あなたの場合、末尾のヌルバイトが含まれ、それがdestinationの直後にヌルで終了する"Over"ため、説明されている動作が見られます。

したがって、への呼び出し後は、次のようにstrncpy myString比較されます。

"Over\0There"

ソリューション

最も簡単な解決策は、末尾の null バイトを from からコピーしないことです。これは、 toの代わりに"Over"指定するのと同じくらい簡単です。45strncpy

strncpy(myString, "Over", 4);
于 2014-03-24T01:55:08.087 に答える
1

strncopy のドキュメントは次のとおりです。

char * strncpy ( char * destination, const char * source, size_t num );

ソースの最初の num 文字を宛先にコピーします。num 文字がコピーされる前にソース C 文字列 (null 文字によって通知される) の末尾が見つかった場合、合計 num 文字が書き込まれるまで、destination にゼロが埋め込まれます。

を呼び出すとstrncpy(myString, "Over", 5)、実際には "Over\n" が myString にコピーされます。おそらく、最後のパラメーターを strlen(source) として strncpy を呼び出したほうがよいでしょう。

于 2014-03-24T01:57:02.067 に答える