如何在C中实现重复char的函数?

时间:2017-12-31 16:56:12

标签: c

我有这个功能让我很难过:

char * repeat_char(const char c, const int times, char *result) {

   for (int i = 0; i < times; i++) {
      *(result + i) = c;
   }

   return result;
}

您可能会告诉我我正在尝试重复c times次并将结果存储在字符串result中(字符指针)。

我这样调用它:

char *result = "";
repeat_char('o', 3, result); // hoping for "ooo"

但我得到的只是一个令人讨厌的事情:

RUN FINISHED; Segmentation fault; core dumped; real time: 160ms; user: 0ms; system: 0ms

我真的很困惑。任何人?感谢

2 个答案:

答案 0 :(得分:5)

那是因为您正在尝试更改为不可修改的字符串文字。这就是你得到错误的原因。这是undefined behavior

  • 分配动态分配的内存并将指针传递给它 - 或 -

  • 只需传递一个不是字符串文字的char数组。

确保传递的字符串足以保存结果。(以及'\0'这不是强制性的。你可以有一个char数组而不终止NUL,但是你不能在标准的字符串函数中使用它,它需要NUL终止的char数组。

解决方案是使用

之类的东西
char *result = malloc(10);
// check the return value of malloc.
// if result is not NULL pass it.

char result[10];

另外不要忘记放'\0'(由于上述原因)。

即使字符串文字是可变的..

那么它也会让你在尝试访问数组索引时出现分段错误。

char *str = ""基本上指向一个包含\0的单个元素数组,该数组基本上被衰减为指向数组的第一个元素的指针,即char并被赋值给{ {1}}。因此,您只有str个元素,而无法1字符放在3处。

分段错误意味着您正在访问一些您不应该访问的内存。

答案 1 :(得分:4)

在C中,不得修改字符串文字。任何修改字符串文字的尝试都将导致未定义的行为。您可以使用大小为times的char数组,而不是字符串文字。

更改

char *result = "";  

char result[3];