【问题标题】:Strncpy and char **strncpy 和 char **
【发布时间】:2014-04-10 19:44:14
【问题描述】:

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

char **keys;
char matches[2000];
char *matches2;
matches2 =strtok(matches," ");
strncpy(keys[0],matches2, sizeof keys[0]);

【问题讨论】:

  • sizeof keys[0]sizeof char*...
  • 不能这样编译
  • @user3521003:不编译什么办法? nneonneo 并没有建议修复代码,他是在指出一个问题。从语法上讲,它是sizeof (char*) 而不是sizeof char*,但这不是要使用的正确大小。此外,你还没有初始化keys,所以keys[0] 是没有意义的。最后,strncpy() 很少是正确使用的函数;见my rant on the topic

标签: c strncpy


【解决方案1】:

您忘记为keys 分配指向的空间,以及为keys[#] 指向的空间。
另外,您确定要使用strncpy 吗?它不保证 0 终止,而是复制 ggiven 字符串的最多 n 个字节并用 0 填充缓冲区的其余部分。

字符串的大小是包含0-终止符的元素个数:strlen(s)+1

要创建字符串的副本,您可能会查看非标准的strdup,这是一种可能的实现:

char* strdup(const char* s) {
    size_t n = strlen(s)+1;
    char* r = malloc(n);
    if(r)
        memcpy(r, s, n);
    return r;
}

【讨论】:

  • keys[0]=(char*)malloc(20*sizeof(char)); strncpy(keys[matches_number],matches2, 20*sizeof(char));它是否正确?不工作......
  • @user3521003:???你想说什么?旁白:千万不要投malloc之类的返回值,它只会隐藏错误。
【解决方案2】:

假设您已经为键[0]分配了空间,请尝试此操作

strncpy(keys[0], matches2, /*your desired size*/);

strcpy(keys[0], matches2);

【讨论】:

  • keys 尚未初始化时,您期望strlen(keys[0] 是什么?
猜你喜欢
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2016-02-10
  • 2012-04-07
  • 2021-05-29
  • 1970-01-01
相关资源
最近更新 更多