我写了一个程序来替换字符串中的字母。虽然它没有错误,但输出不符合预期。请帮帮我。
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<string.h>
void replace(char s,char d);
char a[100];
int main()
{
char b,r;
printf("enter the string\n:");
gets(a);
printf("enter the the letter to be replaced\n:");
scanf("%c", &b);
printf("enter the letter to be replaced with\n:");
scanf("%c", &r);
replace(b,r);
}
void replace(char s, char d)
{
int i,f=0;
for (i = 0; a[i] != '\0'; i++)
{
if (a[i] == s)
{
a[i] = d;
f = 1;
}
}
if (f == 0)
{
printf("letter not found");
}
}
输出
enter the string
:hello every one
enter the the letter to be replaced
:e
enter the letter to be replaced with
:letter not found
我想用o替换e,但是我无法为要替换的单词输入
更新
使用scanf
时,使用此循环消除输入缓冲区问题
但我不确定如何在我的程序上实现它需要帮助
void
clear(void)
{
while ( getchar() != '\n' )
;
}
答案 0 :(得分:2)
当您使用scanf()
说明符读取字符串时,%s
函数会跳过初始空格字符,但当您使用{{1}读取char
时,它不会执行此操作说明符。您使用的%c
函数(您永远不会使用它)读取换行符并将其丢弃。因此,您对gets()
的第一次调用具有干净的输入流。当您第一次调用scanf()
时,会将值读入变量scanf()
,但在输入流中会留下尾随换行符。然后,当您尝试读取下一个值时,b
会选择此换行符,而不是您要输入的值。
解决此问题的一个方法是从输入流中丢弃任何不需要的字符,如下所示:
scanf()
如果您真的要小心,还可以在条件表达式中测试while (getchar() != '\n')
continue; // discard unwanted characters
字符。这种方法的一个优点是,无论用户在第二个提示符下输入多少个字符,只会获取第一个字符,并且丢弃通过换行符的剩余字符。由于输入流中没有任何内容,EOF
必须等待用户在第三次提示时输入内容。您应该在每次调用scanf()
后放置此代码,以确保输入流清晰。
现在,scanf()
是一个糟糕且不安全的函数,它要求缓冲区溢出,因为它不会检查是否有足够的内存分配给它所获得的字符串。相反,请使用gets()
。此函数采用一个参数,指定要读取的最大字符数,包括空终止符。 fgets()
也会将换行符读入字符串中,因此如果您不想要它,则必须自行处理。以下是您需要进行的修改:
fgets()
我添加了最终int i = 0;
...
char b,r;
printf("enter the string\n:");
fgets(a, 100, stdin);
while(a[i] != '\n' && a[i] != '\0') // remove newline
++i;
a[i] = '\0';
printf("enter the the letter to be replaced\n:");
scanf("%c", &b);
while (getchar() != '\n')
continue; // discard unwanted characters
printf("enter the letter to be replaced with\n:");
scanf("%c", &r);
while (getchar() != '\n')
continue; // discard unwanted characters
replace(b,r);
printf("%s\n", a);
...
以显示更改后的字符串。