任务是在字符串中的每个*
之后添加*
:
Input:*fsd*fds*fds*f Output: **fsd**fds**fds**f
我发现了这个问题,我正在尝试将每个*
替换为**
但这行不通。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <string.h>
int main() {
char x[256];
scanf("%s", &x);
for (char* p = x; p = strchr(p, '*'); ++p) {
*p = '*';
}
printf("%s", x);
system("pause");
return 0;
}
仅当我在此行中使用一个字符时才有效
*p = '*';
但是当我使用更多时它不起作用。
所以*p = '**';
不起作用。
答案 0 :(得分:1)
正如我在评论中提到的那样,当您将*
替换为**
时,您将写两个字符代替一个字符,因此它将替换*
之后的下一个字符。另一种方法是采用另一个空数组并从输入字符串中复制元素,当您发现*
时,可以插入两个**
。以下代码段显示了一种可能的解决方案。
#include<stdio.h>
#include <string.h>
int main() {
char x[256],y[256];
unsigned index = 0;
scanf("%s", x);
for (unsigned i = 0; i < strlen(x); i++) {
y[index++] = x[i];
if(x[i] == '*')
y[index++] = '*';
}
y[index] = '\0';
printf("%s", y);
system("pause");
return 0;
}
答案 1 :(得分:0)
如果您一次只读取一个字符,则编写代码会更容易:
#include <stdio.h>
int main() {
while (1) {
int input = fgetc(stdin);
if (input == EOF) { break; }
if (input == '*') { fputc('*', stdout); }
fputc(input, stdout);
}
}
此外,由于我们不在这里处理内存分配,数组或字符串,因此编写不受缓冲区溢出错误影响的安全代码要容易得多。
注意:C标准的最新版本将return 0;
隐式放在main
函数的末尾,因此您不必自己编写它。