我只是从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;
}

最佳答案

问题



strncpy (destination, source, max_len)


strncpy被定义为最多将max_len个字符从source复制到destination,如果source的前max_len个字节中不包含空字节,则包括尾随的空字节。

在您的情况下,将包含尾随的空字节,并且destination将直接在"Over"之后以空终止,这就是为什么您看到上述行为的原因。

因此,在您呼叫strncpy myString之后,其将等于:

"Over\0There"




解决方案

最直接的解决方案是不从"Over"复制尾随的空字节,就像将4而不是5指定到strncpy一样容易:

strncpy(myString, "Over", 4);

关于c++ - strncpy函数无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22599766/

10-11 21:02