问题标签 [strncpy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
5361 浏览

c++ - 如何快速复制 std::string 内容?

我已经阅读了一些 相关的 问题memcpy,但没有关于和之间的速度比较strncpy

您建议如何跟踪关键部分中的字符串内容?

  • 避免动态内存分配
  • 代码的优雅和可读/可理解(几行代码)
  • 快速处理(指令少,防止分支未命中)
  • 能够被编译器优化(或已经使用优化指令的实现)

我在考虑函数:

  1. memcpy需要计算最小长度(参见coliru.stacked-crooked.com上的片段)

    /li>
  2. strncpy搜索终止空字节和不必要的填充所有最终字节(见代码片段

    /li>
  3. snprintf?

  4. std::string::copy正如dyp的评论所建议的......

  5. std::copy正如同一个dyp的评论再次建议的那样......

  6. 还有其他想法吗?

可以执行基准测试,但它应该基于多个编译器/版本、不同的标志集和不同的硬件/操作系统。我更喜欢基于您的反馈/背景/专业知识或数学知识的答案......

由于这是一个一般性问题,搜索相同相关问题的人会喜欢一般性答案,而不是我自己当前的具体案例。

供您参考,一个线程需要在文件中写入一些std::string内容,以便另一个线程可以更改它们的内容。我无法更改此其他线程,并且此其他线程非常忙。如果我不锁定(互斥/自旋锁)字符串副本,我有时会遇到一些问题。因此,我想快速复制这些std::string并将它们写在锁定部分之后。

0 投票
2 回答
5861 浏览

c - 用零填充 C-Array,然后将数据复制到其中

这是使用套接字进行网络通信的 FTP 客户端应用程序的一部分。在向 FTP 服务器发送命令之前,我想将命令缓冲区初始化为零 - 没有机会将新命令与可能位于缓冲区末尾的任何旧字符混合(在新命令之后和'\0'.

编辑:以下是上述函数的调用:

sendCommand(client_socket, "USER anonymous\r\n", sizeof("USER anonymous\r\n"));

问题是:缓冲区真的变空了,然后被命令填满,但服务器无法识别某些命令(例如 PASV)。问题出在代码中,因为如果我尝试注释掉,memset(&cmd, 0, sizeof(cmd));我会得到当前命令的预期结果加上缓冲区尾部的错误 500 Unknown commandcmd

这是来自服务器的示例答案:

提前致谢!

0 投票
2 回答
69 浏览

c - 在C中增加数组大小的奇怪方法?

我认为通常你不能增加数组的大小。但如果我这样做:

字符 arr[4];

strncpy(arr,"12347777",8);

它显示当我调用 strlen(arr) 时长度增加了。有人可以向我解释那里发生了什么吗?

0 投票
1 回答
190 浏览

c - 使用 strncpy 从我离开的地方继续

我有一个字符缓冲区 - char buff[1000],并试图用来strncpy读取前 16 个字符并将其存储为列表的一部分,然后读取接下来的 24 个字符并将其存储为列表的另一部分。但是,当我调用strncpy两次时,第二次strncpy返回缓冲区的开头,而不是我在第一次之后停止的地方strncpy

我该如何解决?谢谢!!!

0 投票
2 回答
149 浏览

c - 如何稳健地将文本复制到 char* 而不会出现任何错误

我有2个问题..

  1. 对 a 执行以下命令时是否需要添加终止字符char *string

    strcpy();

    strncpy();

  2. 是否有必要在执行上述任何操作之前分配内存以针对char *string?

例如..

请解释。

编辑: 在上面的代码中,我倒置了参数。这只是我在这里问问题时犯的错字。正确的方法应该是

0 投票
1 回答
225 浏览

visual-studio-2012 - strncpy 在 mingw 和 Visual Studio 2010 中的行为不同

考虑下面的代码:当我在 mingw 64 下运行时,d->box 等于“jp2”,那么 br 也等于“jp2”。即它是空终止的。所以 strcmp 成功并返回 0。

在 Visual Studio 2012 下,scrncpy 不返回以空字符结尾的字符串。

strcmp 在这种情况下失败。但是,根据 strcmp 文档:

///////////////////////////////////////// ///////////////////

strcmp 比较两个字符串 比较 C 字符串 str1 和 C 字符串 str2。

此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以下对,直到字符不同或到达终止空字符。

///////////////////////////////////////// /////////////////////

因此,strcmp 应该会成功,即使一个字符串以 null 结尾而一个字符串不是。

关于为什么会这样的任何想法?

0 投票
4 回答
162 浏览

c - strncpy() 随机结果

这应该复制一个字符串,但打印出乱码的结果。谁能帮我吗?

我期待“Hello Hello”,但终端打印:

即使 strncpy 的签名,GCC 也会打印关于 a 和 b 具有不兼容指针类型的警告:

要求 2 个字符指针。那是因为数组总是 char** 如https://stackoverflow.com/a/20213168中所述?

0 投票
3 回答
781 浏览

c++ - strncpy 函数不适合我

我只是从 C++ 开始,所以在这里我可能会犯一个愚蠢的错误。下面是我的代码以及评论中的输出。我正在使用 Xcode。

0 投票
2 回答
101 浏览

c - strncpy 修改的程序的行为

考虑,

当我运行这个程序时,什么都没有打印出来。但是当我评论对 strncpy 的调用时,它会打印“Hello !! 0”。

用过ideone(“ http://ideone.com/j1cdKp ”)

当我使用 gcc 编译器(Debian 7.4)时,它给出了预期的输出(“Hello !!hello 6”)。

谁能解释这种行为?

-新手

0 投票
2 回答
322 浏览

c - strncpy 和字符 **

以下代码不会将匹配项 2 的内容复制到键 [0]。为什么呢?