陷入c程序如何在进程中停止scanf

时间:2014-02-21 12:18:40

标签: c algorithm scanf

我正在写一个小程序,它输入国家名称,包括3个字母和国家在奥运会上获得的奖牌数量,除非“#34; end&#34”这个词,否则该程序将一直要求输入。 ;进入。我写了一个while循环来做这个,但我似乎无法停止

//Program calculate the winner of olympics based on metal input
#include<stdio.h>
#include<string.h>
int main (void)
{
    int maxMedals=0, tempGold=0, tempSilver=0, tempBronze=0,tempSum;
    char country[3];
    char winner[3];
    printf("\no o o    O L Y M P I C    o o o");
    printf("\n o o      S C O R E S      o o\n");
    printf("Enter country code, # gold, # silver, # bronze\n");
    while ((strcmp(country,"end"))!=0)
    {
        printf("==>");
        scanf("%s %d %d %d",&country, &tempGold, &tempSilver, &tempBronze);
        tempSum=tempGold+tempSilver+tempBronze;
        if (maxMedals<tempSum)
        {
            maxMedals = tempSum;
            strcpy(winner, country);
            // printf("\n %s", winner);
        }
        else
        {
            maxMedals=maxMedals;
        }
    }
    printf("\nwe reached here\n");
    printf("\nWinner is %s with %d medals\n", country, maxMedals);

    return 0;
}

4 个答案:

答案 0 :(得分:1)

问题是country只有3个字符。在C中,scanf写入一个十六进制0字符来表示字符串的结尾,strcmp将字符串一直比较到十六进制0(至少在字符串不同之前),所以你需要在"end"至少4个字符。

只有空格为3并且写入3 +十六进制0,你会溢出到未知的内存中,导致undefined behaviour。通过在我的计算机上打印出country,它会打印"endend",这意味着winner似乎直接在内存中country之后,因此它打印了这两个,因为{{1}它也会继续,直到找到一个十六进制0,但是,由于这是未定义的行为,因此不保证这种行为,并且在不同的编译器上可能会有所不同。

尝试将其设为4个字符:

printf

此外,您的循环不正确 - 您仍在处理char country[4]; ,因为您只在处理完毕后检查它。

处理此问题的两种方法:

  • "end"之后立即发出if语句,以检查scanf的“结束”。
  • 在 while循环之前放置break ,在while循环的末尾放置(因此2个相同的scanf

答案 1 :(得分:0)

scanf("%s",&country);
if (strcmp(country,"end") == 0)
    break;
scanf("%d %d %d", &tempGold, &tempSilver, &tempBronze);

希望这种改变有效。首先,您获得国家/地区的输入,如果不是end,则会继续获取其他选项。即使在一行中输入了四个参数,也可以使用。

答案 2 :(得分:0)

您可以将scanf打破如下..所以当您输入“end”时,您将不在while

scanf("%s",country);
if(strcmp(country,"end")==0) 
   break;

scanf("%d %d %d",&tempGold, &tempSilver, &tempBronze);

答案 3 :(得分:0)

您在输入前将country与“结束”进行比较,当您输入end 1 1 1时,您的程序将会停止。但是您的代码可能会导致缓冲区溢出,因为countrywinner被声明为char country[3]; char winner[3];,C中的字符串需要额外的\0作为终端字符结束。如果您只需要输入“结束”来终止程序,只需按照您的说法拆分scanf