c - 字符串中每 3 个字符后插入一个字符

标签 c pointers

每从 str1 复制三个字符到 str2,字符 ch 就会插入到 str2 中。

(Input1) Enter a string:  abc de 
(Input2) Enter a character to be inserted: # 
Output: abc# de

代码:

void insertChar(char *str1, char *str2, char ch) 
{
    int i, j, count = 0, flag = 0;
    char *ptr1, *ptr2, *ptr3;
    ptr1 = str1; //Input string
    ptr3 = &str2; //char string array output

    for (i = 0, j = 0;*ptr1 != '\0'; ptr1++, i++, j++, ptr3++)
    {
        str2[j] = str1[i];
        if (*ptr1 == ' ' && flag != 1)
            ++count;

        if (flag != 1 && count%3)
        {
            flag = 1;
            for(ptr2 = ch;*ptr2 != '\0'; ptr2++)
            {
                str2[++j] = *ptr2;
                ptr3++;
            }
            str2[++j] = ' ';
            ptr3++;
        }
    }
    str2[j] = '\0';
}

但是我的代码无法运行。我可以知道可能是什么问题吗?

最佳答案

正如评论中提到的,代码存在一些问题。

ptr3 = &str2

在这一行中,您没有将字符串分配给 ptr3。相反,您分配的是包含字符串起始地址的指针的地址。例如:假设字符串中的第一个字符位于地址位置 1000。那么,str3 包含值 1000。但是,str3 本身将位于其他位置。假设它位于 2000。那么,ptr3 包含值 2000,递增后,它将指向 2001,依此类推。因此,您会得到错误且危险的值。

for(ptr2 = ch;*ptr2 != '\0'; ptr2++) 行中也存在问题。您正在将 ch 的值分配给 ptr2。这应该给你一个警告。同样,ptr2 指向的内存被更改。因此,*ptr2 尝试取消引用该内存位置。

我为此使用的代码:

void insertChar(char *str1, char *str2, char ch) {
    int count = 0;
    while (*str1) {
        *str2++ = *str1++;
        ++count;
        if (count == 3) {
            *str2++ = ch;
            count = 0;
        }
    }
    *str2 = '\0';
}

一些建议:

  • 尝试声明变量时尽可能接近其用法。
  • 编译程序时使用-Wall选项

关于c - 字符串中每 3 个字符后插入一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52341362/

相关文章:

mysql - mysql.h 中的错误

c - 当结构定义具有指针时分配结构

c - 如何使用 write() 以十六进制形式写入指针地址的标准输出

c++:何时传递指针与返回对象

c - C 中指针值 Null

c - *预期为 'int *',但参数的类型为 'int **' * c 中的警告

c - 如何在 Turbo C 中以十六进制格式存储和打印十六位数字?

c - MISRA C 2004 10.1,printf "%x"的符号

c - 混合 C 和汇编。 64 位 Linux 上的 `Hello World`

C getchar() 刽子手游戏