这段代码在我的编译器(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]);
}
}
答案 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}},并根据您的分配要求准确考虑您要用于输入字符串的内容。