无法用另一个字符串替换字符串中的字符

问题描述:

下面是一个问题,我们需要用另一个新字符串替换字符串中所有字符的出现。 下面给出的是这样一个问题:无法用另一个字符串替换字符串中的字符

编写一个程序,替换给定字符的发生(比如C) 在主字符串(说PS)与另一个字符串(比如S)。

输入: 第一行包含在主串(PS) 下一行包含一个字符(C) 下一行包含一个字符串(或多个)

输出: 打印串PS与每一个发生c被s代替。

NOTE: - PS或s中没有空格。 - PS的最大长度为100 - S的最大长度为10

下面是我的代码:

#include<stdio.h> 
int main() 
{ 
    char ps[100],*ptr,c,s[10]; 

    printf("Enter any string:"); 
    gets(ps); 

    printf("Enter the character you want to replace:"); 
    scanf("%c",&c); 

    printf("Enter the new string:"); 
    fflush(stdin); 
    scanf("%s",&s); 

    ptr=ps; 

    while(*ptr!='\0') 
    { 
     if(*ptr==c) 
     *ptr=s; 
     ptr++; 
    } 

    printf("Final string is:"); 
    puts(ps); 
    return 0; 
} 

我不能用字符串替换字符。它只是给我一个垃圾输出而不是我想要替换的角色。

但是,当我将它声明为字符时,输出与预期的一样。它用另一个角色代替角色。

你能帮我解决吗?

+2

'fflush(stdin)'和'gets()'...都是坏的。 –

+2

你看到的'垃圾'可能是一个内存地址... –

+2

我建议将结果字符串写入一个新的'char'数组。 'c'中的数组不会自动调整大小。即使你正确地用字符串's'替换字符'c',如果's'多于一个字符长度,它将覆盖'ps'中的字符,这不是你想要的。你当然可以在阵列中移动角色来为新阵列腾出空间,但这会比编写一个新阵列更困难的编码方式。 – yano

*ptr=s;

if(*ptr==c) 
    *ptr=s; 

真的分配字符数组s到所述存储器位置的基地址由ptr指向。这不会用字符串替换字符,但会导致错误。

我同意yano。最好创建一个新的字符数组来存储结果字符串,因为原始数组可能没有足够的空间来容纳新字符串。

如果新的字符串是result,你可以不喜欢

for(i=j=0; ps[i]!='\0'; ++i) 
{ 
    result[j++]=ps[i]; 
    if(ps[i]==c) 
    { 
     for(--j, k=0; s[k]!='\0'; ++k) 
     { 
      result[j++]=s[k]; 
     } 
    } 
} 
result[j]=0; 

scanf("%s",&s);scanf("%s", s);作为数组decays into a pointer它的第一个元素的名称。

最好避免gets()fflush(stdin)作为Sourav Ghosh提到。

fgets()gets()because you can guarantee you never overflow the input string buffer更安全。

至于fflush(stdin)是错的,看看here

在C中,一个字符串是一个字符序列,由第一个地址表示。因此*ptr = s应该已经得到了关于编译器中不匹配类型的警告。如果你想插入一个字符串到另一个,你需要移动其他字符,以腾出空间。

,但似乎你的问题的描述并不要求你做一个新的字符串,只是打印仿佛你了。因此,您可以遍历原始字符串,并且对于每个字符,如果要替换它,则打印替换字符串,否则打印原始字符。

+0

可以改进:“在C中,一个字符串是一系列字符,由第一个地址表示。”在C中,_string_是一个字符序列,包括_null字符_。 _string_更像是一个数组而不是一个地址。 – chux

+0

谢谢,但我该如何更改我的代码?我应该确定新的字符串长度并在要替换的字符后创建那么多空格吗?如果是的话,我该怎么做? – akash11