【问题标题】:Simple C substring implementation简单的 C 子字符串实现
【发布时间】:2012-10-17 08:09:37
【问题描述】:

我正在尝试在 C 中实现一个子字符串函数。这是我目前所拥有的:

char *substring(const char* str, int beg, int n)
{
   char *ret = malloc(n+1); 
   strncpy(ret, (str + beg), n);
   *(ret+n) = '\n';

   return ret;    
}    

但是,当我有这个主要功能时:

int main()
{
   char *a = "thisisalongstring";
   char *c;

   c = substring(a, 2, 5);
   printf("%s", c);

   return 0;
}

输出是:

isisa
<random characters>  

对调试代码有帮助吗?

【问题讨论】:

  • &lt;random characters&gt; 这是因为您正在访问随机内存。 printf() 需要 \0 才能知道您的区域内存在哪里结束。
  • 如果将 char * 声明为 s 而不是 c,则更具可读性

标签: c string pointers substring


【解决方案1】:

你应该空终止字符串。

*(ret+n) = '\n';

应该是

*(ret+n) = 0;

注意:

您还应该确保子字符串不超过字符串大小:

beg+n < strlen(str)

【讨论】:

  • 确保beg 实际上是inside 字符串也是一个好主意,或者您可以执行substring("foo", 10, 10) 之类的操作,这会导致未定义的行为. strncpy 能够应付很长的长度,所以不需要检查。
  • 感谢您指出这个错误,它本来应该是 '\0' 而不是 '\n'。但是 0 也可以正常工作。谢谢。
  • 您应该使用&lt;= 进行这些检查,例如if(beg+n &lt;= strlen(str) &amp;&amp; beg &lt;= strlen(str)) { ... }
【解决方案2】:

我认为你也应该检查一下

str != NULL

n > 0

也可能是beg。当beg 为负数时,您也可以从末尾开始计数。

例如,对于char *a = "thisisalongstring";substring( a, -1, 1 ) 表示字符串中的最后一个字符,即g

【讨论】:

    猜你喜欢
    • 2016-09-11
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    相关资源
    最近更新 更多