我正在写一个小程序,它输入国家名称,包括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;
}
答案 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
的“结束”。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
时,您的程序将会停止。但是您的代码可能会导致缓冲区溢出,因为country
和winner
被声明为char country[3];
char winner[3];
,C中的字符串需要额外的\0
作为终端字符结束。如果您只需要输入“结束”来终止程序,只需按照您的说法拆分scanf
。