用C代替另一封信的程序

时间:2016-10-17 04:12:12

标签: c visual-studio

我写了一个程序来替换字符串中的字母。虽然它没有错误,但输出不符合预期。请帮帮我。

#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' )
        ;
    }

1 个答案:

答案 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); ... 以显示更改后的字符串。