我的代码无法正常工作,我做错了什么?正如标题所说,它应该创建一个用3.14替换'pi'的新字符串。当我输入pi时,它的工作正常,但是当我键入类似'pipi'的东西时,它只返回3.14而不是3.143.14 ...... 感谢您的帮助:)
#include<stdio.h>
#include<string.h>
char c[50];
char xy(char a[],int b)
{
if(b>=strlen(a))
return a;
else if(a[b]=='p' && a[b+1]=='i'){
c[b]='3';
c[b+1]='.';
c[b+2]='1';
c[b+3]='4';
return xy(a,b+4);}
else if(a[b]!='i') {
c[b]=a[b];
return xy(a,b+1);
}
}
int main()
{
char a[50];
scanf("%s",&a);
xy(a,0);
printf("%s",c);
return 0;
}
答案 0 :(得分:1)
您的代码可能会被戏弄成工作,但转发指针会更有效。您的代码存在的一个问题是scanf("%s", &a)
将在第一个空格处停止。
以下返工消除了返回任何东西的需要,只有一个流动方向。它还消除了全局'c'。
最后,它依赖于C字符串以nul字节('\ 0')终止的事实,不需要了解src字符串的大小。
注意:一个好的优化器会把它变成一个循环:)
#include <stdio.h>
void transform(char* dst, const char* src)
{
if(!*src) {
*dst = '\0';
return;
}
if(*src == 'p' && *(src + 1) == 'i') {
*(dst++) = '3';
*(dst++) = '.';
*(dst++) = '1';
*(dst++) = '4';
src += 2; // skip 'pi' in src.
} else {
*(dst++) = *(src++);
}
transform(dst, src);
}
int main()
{
char a[64], b[64];
fgets(a, sizeof(a), stdin);
transform(b, a);
printf("%s", b);
return 0;
}
答案 1 :(得分:0)
键入pipi
您正在传递b+4
。实际上,在第一次pi
之后,您需要检查第二个pi
,因此您需要通过b+2
return xy(a,b+4);
相应地修改您的代码。
答案 2 :(得分:0)
您可以按以下步骤修改代码:
char xy(char a[],int b, int i)
{
if(i>=strlen(a))
return a;
else if(a[i]=='p' && a[i+1]=='i') {
c[b]='3';
c[b+1]='.';
c[b+2]='1';
c[b+3]='4';
return xy(a,b+4, i+2);
}
}
答案 3 :(得分:-1)
尝试一下:
include <iostream>
include <cstring>
using namespace std;
char* replace(char* a, char* b)
{
int len = strlen(b);
if(a[0] == '\0') {
b[len] = '\0';
return b;
}
if(a[0]=='p' && a[1]=='i'){
b[len + 0]='3';
b[len + 1]='.';
b[len + 2]='1';
b[len + 3]='4';
b[len + 4] = '\0';
replace(a + 2,b);
}
else {
b[len + 0]= a[0];//h
b[len + 1] = '\0';//'\0'
replace(a + 1, b);//ellopi
}
}
void transform(char input[])
{
char *arr=new char[strlen(input) * 2+1];
arr[0] = '\0';
strcpy(input, replace(input, arr));
}
int main()
{
char a[100];
cin.getline(a,100);
transform(a);
cout<<a;
return 0;
}