gpt4 book ai didi

c - 卡在 c 程序中如何在进程中间停止 scanf

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:28:00 28 4
gpt4 key购买 nike

我正在编写一个小程序,它需要输入由 3 个字母组成的国家名称和该国家在奥运会上获得的奖牌数量,并且该程序将不断要求输入,除非输入“结束”一词。我写了一个 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;
}

最佳答案

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

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

试着让它变成 4 个字符:

char country[4];

此外,您的循环不正确 - 您仍在处理 "end",因为您只在处理后检查它。

处理这个问题的两种方法:

  • scanf 之后放置一个 if 语句来检查 break 的“end”。
  • 在 while 循环的之前放一个 scanf,在 while 循环的末尾放一个 scanf(所以 2 个相同的 scanf 的)。

关于c - 卡在 c 程序中如何在进程中间停止 scanf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21934331/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com