bezeichnung, (int)sizeof-6ren">
gpt4 book ai didi

c - 使用 scanf 时获取无限运行的程序

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:24 25 4
gpt4 key购买 nike

当我使用以下代码从键盘读取字符串并将其保存在结构化 vector 中时,我得到了一个无限运行的程序。

scanf("%s", strk_zgr_fp->bezeichnung, (int)sizeof(strk_zgr_fp->bezeichnung - 1));

在到达这一行并且程序无限运行之后什么也没有发生。

我知道不推荐使用 scanf()。我们仅在我们的 C 初学者类(class)中使用它,我希望您记住这一点,即暂时不要推荐除上述功能之外的其他功能。

非常感谢任何帮助,提前致谢。

#include <stdio.h>

typedef struct {
int nummer;
char bezeichnung;
int menge;
float preis;
} artikel;

void eingabe_artikel(artikel *strk_zgr_fp, int i_fp);
void ausgabe_artikel(artikel *strk_zgr_fp, int i_fp);

void main(void) {
artikel artikelliste[10];
artikel *strk_zgr;

int anzahl;

do {
printf("Bitte eine #Artikel eingeben [<= 10]: ");
scanf("%d", &anzahl);

if(anzahl < 1 || 10 < anzahl)
printf("\nEs wurde eine falsche #Artikel eingegeben.");
} while(anzahl < 1 || 10 < anzahl);

for(int i = 0; i < anzahl; i++)
eingabe_artikel(&artikelliste[i], i);

int i;
for(strk_zgr = artikelliste, i = 0; strk_zgr < artikelliste + anzahl;
strk_zgr++, i++)
ausgabe_artikel(strk_zgr, i);
}

void eingabe_artikel(artikel *strk_zgr_fp, int i_fp) {
printf("\nBitte den %d. Artikel eingeben: ", ++i_fp);

printf("\nNummer: ");
scanf("%d", &strk_zgr_fp->nummer);

printf("Bezeichnung: );
scanf("%s", strk_zgr_fp, (int)sizeof(strk_zgr_fp->bezeichnung - 1)); /* <-- */

printf("Menge: ");
scanf("%d", &strk_zgr_fp->menge);

float preis;
printf("Preis: );
scanf("%f", &preis);
strk_zgr_fp->preis = preis;
}

void ausgabe_artikel(artikel *strk_zgr_fp, int i_fp) {
printf("\n%d. Artikel: ", ++i_fp);

printf("\nNummer:\t%d", strk_zgr_fp->nummer);
printf("\nBezeichnung:\t%s", strk_zgr_fp->bezeichnung);
printf("\nMenge:\t%d", strk_zgr_fp->menge);
printf("\nPreis:\t%.2f EUR\n", strk_zgr_fp->preis);
}

NetBeans Version

Complier Version

最佳答案

代码中有很多问题。请至少修复 printf() 调用中缺少的结束引号。

现在是牛肉:

1) 你的结构是错误的。 'Bezeichnung' 被定义为单个字符,而不是字符串。

typedef struct {
int nummer;
char bezeichnung[100];
int menge;
float preis;
} artikel;

2) 您不能像以前那样使用 scanf() 。如果你想限制输入长度(这总是一个好主意),你需要将最大长度传递到格式字符串中。你需要使用 scanf() 吗?因为从这里开始变得凌乱......由于您的最大输入长度可能是可变的或可能会发生变化(请参阅 1.),因此您需要为 scanf 构建格式字符串。像这样:

char format_str[15];
format_str[0] = '%';
//Dont use itoa(), it is not C standard.
sprintf(&format_str[1], "%d", (int)sizeof(strk_zgr_fp->bezeichnung) - 1);
strcat(format_str, "s");
scanf(format_str, strk_zgr_fp->bezeichnung);

希望这能让你继续前进。

PS:您需要为 strcat() 包含 string.h。

关于c - 使用 scanf 时获取无限运行的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53119364/

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