【问题标题】:Using strncat with char array element in C在C中使用带有char数组元素的strncat
【发布时间】:2010-05-15 11:49:22
【问题描述】:

以下代码出现错误,我无法弄清楚。

   char name[]="tolgahan"
   char result[100]="";
   strncat(result,name[1],1);

我想,我需要将 name[1] 转换为字符串格式,但我现在不知道该怎么做。

请帮助我。 最好的问候。

【问题讨论】:

  • 你到底想做什么?您似乎正在尝试将名称的第二个字母复制到结果中。

标签: c string char character


【解决方案1】:

试试:

strncat(result, & name[1],1);

strncat(result, name + 1,1);

解释:C 中的字符串只是字符序列中第一个字符的地址(在内存中)。因此,如果您获取指针(使用 & 运算符或将初始指针加 1),您将得到一个从初始字符串的第二个字符开始的字符串。

【讨论】:

  • 非常感谢您的回答和解释。
  • 警告:请注意,如果 strncat 实际上必须截断过长的字符串,上述操作将无法正常工作。 stncpy 和 strncat stupidly (恕我直言)在这种情况下不会 NUL 终止您的字符串。您应该始终遵循带有(在此示例中)结果 [99] = '\0'; 的 strncpy() 或 strncat()确保生成的字符串是 NUL 终止的,否则您可能会遇到严重的崩溃。 (我说“愚蠢”是因为没有 NUL 终止符的 NUL 终止字符串是完全损坏的,而“str ...”函数应该与 NUL 终止的字符串一起使用,因此,它们不应该产生损坏的字符串!)
  • @Jason Williams:strncat 总是 NUL 终止。 strncpy 不做这样的保证。
  • @jamesdlin:好的,很公平。 '这只是 strncpy 非常不一致和恼人的 :-) (我检查确定,但设法找到一个相当糟糕的参考页面 :-)
【解决方案2】:

表达式

name[1] 

是一个字符 - 你想要一个指针:

strncat(result,name + 1,1);

【讨论】:

    【解决方案3】:

    但是使用 strncat 复制 1 个字符是矫枉过正,而且不是很聪明。

    在你的情况下,我会做更多这样的事情

     char name[]="tolgahan";
     char result[100]= "";
     size_t l = 0;
     result[l++] = name[1];
    

    通过跟踪我的第一个字符串的长度,我可以避免隐藏的 strlen 调用(这就是 strncat 在内部所做的)。

     result[l++] = 'H';
     result[l++] = 'e';
     result[l++] = 'l';
     result[l++] = 'l';
     result[l++] = 'o';
     result[l++] = 0;
    

    l 中的字符串的实际长度仍然存在,并且我避免了调用,编译器甚至可以在内部重新排列内容以使用更少的内存操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 2020-09-27
      • 2019-08-04
      • 2017-10-14
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多