用C中的另一个子字符串替换字符串的一部分

时间:2014-04-19 12:38:05

标签: c string replace substring

这段代码在我的编译器(DEV C ++)中工作得非常好,但在Ideone.com中却没有。它不接受替换字符串。我的逻辑有什么问题吗?我可以知道我的代码有什么问题吗?

//splitting a string and replace latter part of string by another string
#include<stdio.h>
#include<string.h>
int i,count=0,loc2=0,scount=0,rcount=0,loc=0;       //scount represents counter for substring and rcount for replacement and loc from where we will split the string
char str[100],sub[100],newss[100];  //newss=new substr, rslt and rslt2=former and latter part of original string
int main()
{
    String();
    substring();
    new_string();
    concat();
    return 0;
}
void String()
{
    printf("Enter a String:\n");
    gets(str);
    printf("\nString Entered by User:\n");
    puts(str);
    printf("\nLoc Char\n");         //Creates Colums 'Char' and 'Loc'
    for(i=0;str[i]!='\0';i++)
    {
        count++;                                //Counts length of String
        printf("%d. %c\n",count,str[i]);    //Prints Characters with it its Corresponding Location
    }
    printf("\n\nLength of String: %d\n\n",count);
}
void substring()
{
    printf("Enter the locations of Characters from where substring will start and end: \n");
    scanf("%d%d",&loc,&loc2);       //stores indices of begining and end of substring
    printf("\n\nSubset formed from Existing String:\n");
    for(i=loc-1;i<loc2;i++)
    {
        scount++;
        sub[i]=str[i];              //stores substring in "sub"
        printf("%c",sub[i]);
    }
    printf("\n\nLength of substring: %d\n",scount);
}
void new_string()
{
    printf("\n\nEnter a Replacement for substring(Of Equal Length as that of substring):\n");
    fflush(stdin);
    gets(newss);
    for(i=0;newss[i]!='\0';i++)
    rcount++;
    printf("\n\nLength of New substring: %d\n",rcount); //-1 to subtract length of null char
}
void concat()
{
    if(rcount!=scount)      //to check whether replacement string and substring are of same length
    printf("\nSince length of both substrings is not same. \nHence Replacement is Not Possible\n");
    else        //Concatination of 3 substrings
    {
        printf("\nResultant String:\n");
        for(i=0;i<(loc-1);i++)
        printf("%c",str[i]);
        for(i=0;newss[i]!='\0';i++)
        printf("%c",newss[i]);
        for(i=loc2;str[i]!='\0';i++)
        printf("%c",str[i]);
    }
}

1 个答案:

答案 0 :(得分:0)

你做了很多奇怪的事情,还有一些不好的事情,其中​​一个重大问题是你正在混淆对gets()scanf()的调用,他们会处理新行字符不同,它让你陷入困境。

当您使用substring()拨打scanf()来获取两个子字符串索引时,它会在{{1}上留下换行符('\n')然后,您对stdin的调用正在读取并将其用作字符串。

变化:

gets()

要:

gets(newss);

事情将在ideone.com中有效。

您可能想知道为什么在阅读scanf(" %s", newss); 之前致电fflush(stdin);时遇到此问题。这是我所描述的&#34;坏事&#34;之前。永远不应该newss。这会导致未定义的行为,fflush(stdin)已为fflush()定义明确,但stdout未定义。这意味着调用可以刷新输入缓冲区,或者它不能取决于你在使用的IDE中实现的方式(或者根本不是)。如果它未在C标准中定义,则您无法认为它可以正常工作。


编辑:
您的示例是在您输入的子字符串中使用空格,因此答案是相同的,但您需要使用否定的扫描集:

stdin

空格会告诉scanf(" %[^\n]", newss); // note my examples start with a blank space // ^ // | // here 忽略任何剩余的空白&#34; scanf()上留下的字符,表示不会考虑遗留stdin。但是,ALSO意味着如果您的替换字符串以空格开头,则该空格将被忽略。您可以阅读'\n'的{​​{3}},并根据您的分配要求准确考虑您要用于输入字符串的内容。