将char作为变量存储在用户输入中时出错

时间:2014-03-05 21:11:23

标签: c string char iteration

这个想法是我输入一个句子并将其存储为字符串...然后我可以选择一个字母并将其更改为另一个字母

int main(int argc, char *argv[])
{

    char string[100];
    char newLetter;
    char oldLetter;
    int i = 0;

    printf("Please enter your sentence : ");
    gets(string);

    printf("\n\nWord is : %s" , string );

    printf("\n\nTarget : ");
    scanf("%s", &oldLetter);
    printf("Replace with : ");
    scanf("%s", &newLetter);

    for ( i = 0; i < sizeof(string); i++) 
    { 
        if (string[i] == oldLetter)
        { 
            string[i] = newLetter; 
            break;
        } 
    }
    printf("\n\nWord is : %s" , string );

    system("PAUSE");   
    return 0;
}

例如。 输入可能是 - 黄色卡车红色卡车

然后目标 - r

更改为 - t

输出 - 黄色很多特德

3 个答案:

答案 0 :(得分:1)

将扫描两个字母时的%s更改为%c,代码将完美运行。

答案 1 :(得分:0)

首先,由于您的目标是通过char oldLetter将字符存储到char newLetterscanf,因此您应该使用format specifier %c代替%s

但是,由于以下原因,这还不够:当您使用scanfgets等功能时,会提示用户输入stdin流中的字符。 stdin流是缓冲流。您可以将其视为:

  • 你的河流;
  • 将字符放入
  • 你放下的每个角色都留在河里
  • 直到有什么东西把它们拿出来

scanf到来时,您输入A然后按Enter键,就会在流中添加以下字符:

'A' '\n'

\n是新行字符。使用回车键,您还可以通知scanf您已完成。 scanf然后开始发布stdin缓冲区,让我们看看'A'%c 字符的正确值。这需要一个,留下\n

然后下一个scanf来了,在流中寻找%c,找到\n就绪,将其取出。这是你不想要的。两种防止它的方法:

  • fflush( stdin );来电后使用scanf
  • while( getchar( ) != '\n' );来电
  • 后使用scanf

解除/丢弃缓冲区中的剩余字符。

如果要替换每个匹配项而不仅仅是第一个匹配项,请删除break;

答案 2 :(得分:0)

你可以做得对,或者你可以做错了,并希望这个人没有输入正确的一系列击键或管道在一个不以换行结束的文件中,以打破它......你