如何在C中实现一个函数来重复字符?

puruo6ea  于 2023-02-18  发布在  其他
关注(0)|答案(3)|浏览(188)

我有一个函数,这让我很难:

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

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

   return result;
}

正如您可能知道的,我尝试重复ctimes次,并将结果存储在字符串result(一个字符指针)中。
我是这样引用它的:

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

但我得到的只是一个下流的:

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

我真的很困惑。有人知道吗?谢谢

h7appiyu

h7appiyu1#

这是因为你试图改变一个字符串常量,它是 * 不可修改的 *,这就是为什么你会得到这个错误,它是undefined behavior

  • 分配动态分配的内存并向其传递指针,或者-
  • 只需传递一个不是字符串字符数组。
  • 确保传递的字符串足够大以容纳结果。(沿着'\0')* 这不是强制的。您可以有一个字符数组而不终止NUL,但您不能在标准字符串函数中使用它,因为它要求以NUL终止的字符数组。

解决方法是使用类似于

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,并被赋值给str,所以这里只有1元素,你不能把3字符和\0放在一起。

分段错误表示您正在访问一些不应该访问的内存。

0dxa2lsx

0dxa2lsx2#

在C语言中,字符串文字不能被修改。任何试图修改字符串文字的行为都将导致未定义的行为。你可以用大小为times的char数组来代替字符串文字。
变更

char *result = "";

char result[3];
bfnvny8b

bfnvny8b3#

标题.h

#ifndef FALSE
#define FALSE               0
#endif

#ifndef TRUE
#define TRUE                1
#endif

char *repeat_char(const char c, int times);

函数.c

#include "Header.h"

int main()
{
    const char  star = 42;
    printf("%s\n",repeat_char(star,5));
}

char *repeat_char(const char c, int times) 
{
    int     i;
    int     useLoop =   FALSE;  // TRUE = 1 and FALSE = 0
    char    *result =   (char*)calloc(times+1, sizeof(char));

    printf("%i\n",strlen(result));
    printf("'%s'\n", result);

    if (useLoop == TRUE)
    {
       for (i = 0; i < times; i++) 
       {
            result[i] = c;
            printf("%i\n",strlen(result));
            printf("'%s'\n", result);
       }
    }
    else
       memset(result, c, times);
    
    printf("%i\n",strlen(result));
    printf("'%s'\n", result);
    return result;
}

相关问题