每从 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/