无法用另一个字符串

时间:2017-09-01 14:54:37

标签: c string replace

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

编写一个替换给定字符出现的程序(比如说c) 在一个主字符串(比如PS)中用另一个字符串(比如s)。

输入: 第一行包含主字符串(PS) 下一行包含一个字符(c) 下一行包含一个字符串

输出: 打印字符串PS,每次出现c替换为s。

注意: - 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 个答案:

答案 0 :(得分:3)

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

但您的问题描述似乎要求您创建了一个新字符串,只需打印就像一样。所以你可以遍历原始字符串,对于每个字符,如果要替换它,打印替换字符串,否则打印原始字符。

答案 1 :(得分:1)

中的*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