我需要在字符串中的每个*之后加上*
Input:*tret*ret*re*ter
Output:**tret**ret**re**ter
嗯,我的代码可以工作,但是问题是我只能使用一个字符串(数组)。 我用了两个。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <string.h>
int main() {
char x[256], y[256], z = 0;
scanf("%s", x);
for (char i = 0; i < strlen(x); i++) {
y[z++] = x[i];
if (x[i] == '*')
y[z++] = '*';
}
y[z] = '\0';
printf("%s\n", y);
system("pause");
return 0;
}
我将非常感谢您提出仅用一个字符串制作字符串的建议。
我什至尝试过,但它会使炭黑消失
int main() {
char x[256], z = 0;
scanf("%s", x);
for (char i = 0; i < strlen(x); i++) {
if (x[i] == '*') {
x[++i] = '*';
}
}
printf("%s\n",x);
system("pause");
return 0;
}
答案 0 :(得分:1)
我将非常感谢您提供仅使用一个字符串的建议。
算法
计算'*'
-> star_count
的出现次数。
请注意字符串的长度-> length
确保length + star_count
<256,否则缓冲区太小。
从头到尾循环。
将src
设置为字符串的结尾。 (空字符)
将dest
设置为src + star_count
的结尾。
// ***
设置* dest =空字符。
未完成(src
!=开始):
-分配*dest = *src
并递减两个指针。
-有条件地分配*dest = '*'
,并递减dest
。
@Ian Abbott提供了很好的改进。循环直到指针匹配。
来自***
同时dest> src
-分配*dest = *src
并递减两个指针。
-有条件地分配*dest = '*'
,并递减dest
。
答案 1 :(得分:1)
首先,您应该想知道为什么只有一个数组。恕我直言,如果有两个数组更简单,请粘贴在那里。
接下来,您将char用作索引。除非您有充分的理由,否则请不要这样做。一个好的编译器应该警告您,因为它可能导致难以检测到错误。例如,如果您的实现使用带符号的8位char,则最大值为127,而不是255。因此,如果字符串包含128个字符且结尾为null,则循环for (char i = 0; i < strlen(x); i++) {
是一个无限循环。因为127 + 1可能是-128(不确定的行为,但很常见)。
并且您知道x
数组的大小,应该使用有限的scanf
并测试其返回值:
if (scanf("%255s", x) != 1) {
// process error
...
}
对于其他情况,@ chux的答案为您提供了就地扩展字符串的唯一方法:
答案 2 :(得分:0)
当找到一个*
字符时,必须将其后的每个字节向右移,以腾出空间来容纳其他*
字符。以下是一种这样的实现:
#include<stdio.h>
#include <string.h>
int main(void)
{
char x[256] = {'\0'}; // NUL Terminate Every Character
printf("Enter String: ");
scanf("%s", x);
for(int i = 0; i < strlen(x); i++)
{
if(x[i] == '*')
{
for(int j = strlen(x) + 1; j > i; j--)
x[j] = x[j - 1]; // Shift Every Byte, Starting With Last, To Right
x[++i] = '*';
}
}
printf("%s\n", x);
return 0;
}
执行
Enter String: *hi*buddy* **hi**buddy**