gpt4 book ai didi

创建 C 子字符串 : looping with assignment operator VS strncopy, 哪个更好?

转载 作者:太空狗 更新时间:2023-10-29 15:22:27 25 4
gpt4 key购买 nike

这可能有点毫无意义,但我很好奇你们对此有何看法。我正在用指针迭代一个字符串,并想从中提取一个短的子字符串(将子字符串放入一个预先分配的临时数组中)。是否有任何理由在 strncopy 上使用赋值,反之亦然? IE。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main()
{ char orig[] = "Hello. I am looking for Molly.";

/* Strings to store the copies
* Pretend that strings had some prior value, ensure null-termination */
char cpy1[4] = "huh\0";
char cpy2[4] = "huh\0";

/* Pointer to simulate iteration over a string */
char *startptr = orig + 2;
int length = 3;
int i;

/* Using strncopy */
strncpy(cpy1, startptr, length);

/* Using assignment operator */
for (i = 0; i < length; i++)
{ cpy2[i] = *(startptr + i);
}

/* Display Results */
printf("strncpy result:\n");
printf("%s\n\n", cpy1);
printf("loop result:\n");
printf("%s\n", cpy2);
}

在我看来,strncopy 既减少了输入又更易于阅读,但我看到人们提倡循环。有区别吗?这有关系吗?假设这是针对较小的 i (0 < i < 5) 值,并且可以确保空终止。

引用:Strings in c, how to get subString , How to get substring in C , Difference between strncpy and memcpy?

最佳答案

strncpy(char * dst, char *src, size_t len)有两个特殊的属性:

  • 如果(strlen(src) >= len) : 结果字符串不会以 nul 结尾。
  • 如果(strlen(src) < len) : 字符串的末尾将填充/填充“\0”。

第一个属性将强制您实际检查是否 (strlen(src) >= len)并适本地行动。 (或者用 dst[len-1] = '\0'; 粗暴地将最后一个字符设置为 nul,就像上面的 @Gilles 所做的那样)另一个属性不是特别危险,但会溢出很多周期。想象一下:

char buff[10000];
strncpy(buff, "Hello!", sizeof buff);

其中涉及 10000 个字节,其中只需要涉及 7 个字节。

我的建议:

  • A:如果你知道尺寸,就做 memcpy(dst,src,len); dst[len] = 0;
  • B:如果您不知道大小,请以某种方式获取它们(使用 strlen 和/或 sizeof 和/或动态分配内存的分配大小)。然后:转到上面的 A。

因为为了安全操作,strncpy() 版本已经需要知道大小(以及对它们的检查!),memcpy() 版本并不比 strncpy() 版本更复杂或更危险。 (从技术上讲,它甚至稍微快一点;因为 memcpy() 不必检查 '\0' 字节)

关于创建 C 子字符串 : looping with assignment operator VS strncopy, 哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12283681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com