gpt4 book ai didi

c - 几乎完成了基于 int 的排序(我希望)。我在声明变量时遇到了一些最后的麻烦

转载 作者:行者123 更新时间:2023-11-30 16:36:30 26 4
gpt4 key购买 nike

这是我正在处理的代码中的示例。然而,我一直在尝试了解在排序算法中写“XXXX”的地方要输入什么。有任何想法吗?我做的事情是对还是错?发生的唯一错误是“XXXX”未声明,但我无法找出正确的输入。(由于我在该网站上创建代码的技能有限,结构名称和“if”有点“难以阅读” )

代码:

#define NUM_ITEMS sizeof(items) / sizeof(items[0]) struct vara
{
int nummer;
char namn[100];
float pris;
float volym;
char typ[100];
char stil[100];
char forpackning[20];
char land[20];
char producent[50];
float alkoholhalt;


} items[100]; for (i = 0; i < 100 && fgets(envara, 512, fp); i++)
{
envara[strlen(envara) - 1] = '\0';
oneline = strdup(envara);


tok = strtok(oneline, delim);
items[i].nummer = atoi(tok);
tok = strtok(NULL, delim);
strncpy(items[i].namn, tok, (max(strlen(tok), sizeof(items[0].namn))));
tok = strtok(NULL, delim);
items[i].pris = atof(tok);
tok = strtok(NULL, delim);
items[i].volym = atof(tok);
tok = strtok(NULL, delim);
strncpy(items[i].typ, tok, strlen(tok));
tok = strtok(NULL, delim);
strncpy(items[i].stil, tok, strlen(tok));
tok = strtok(NULL, delim);
strncpy(items[i].forpackning, tok, strlen(tok));
tok = strtok(NULL, delim);
strncpy(items[i].land, tok, min(strlen(tok), sizeof(items->land)));
tok = strtok(NULL, delim);
strncpy(items[i].producent, tok, strlen(tok));
tok = strtok(NULL, delim);
items[i].alkoholhalt = atof(tok);


int nummer_sortering(const void* n1, const void* n2)
{
items *XXXX = n1;
items *XXXX = n2;


return items->nummer - items->nummer;
}


printf("\n\nItems sorted by number:");
qsort(items, NUM_ITEMS, sizeof(items), nummer_sortering);
for (i = 0; i < NUM_ITEMS; i++)
printf("nummer: %d\n"
"namn: %s\n"
"pris: %f\n"
"volym: %f\n"
"typ: %s\n"
"stil: %s\n"
"forpackning: %s\n"
"land: %s\n"
"producent: %s\n"
"alkoholhalt: %f\n\n",
items[i].nummer,
items[i].namn,
items[i].pris,
items[i].volym,
items[i].typ,
items[i].stil,
items[i].forpackning,
items[i].land,
items[i].producent,
items[i].alkoholhalt);

最佳答案

你的比较函数是错误的,编译器应该给你一个错误。

items 是什么类型?您不能声明名称为另一个变量。应该是:

int nummer_sortering(const void* n1, const void* n2)
{

struct vara *item1 = n1;
struct vara *item2 = n2;

return n1->nummer - n2->nummer;
}

也在做

envara[strlen(envara) - 1] = '\0';

不正确。如果输入的长度超过 511 个字符,envara[strlen(envara) - 1] 不会是换行符。最好的去除方法是换行符(如果有)是:

envara[strcspn(envara, "\n")] = '\0';

还有

strncpy(items[i].producent, tok, strlen(tok));

您使用的strncpy错误。 strncpy 的要点是限制根据目标大小复制的字节数。你正在限制基于源长度的字节数。如果它比什么长 Producent 可以容纳,那么就会出现缓冲区溢出。还请记住strncpy 不一定会写入 '\0' 终止字节。你必须确保您自己:

size_t max = sizeof items[i].producent;
strncpy(items[i].producent, tok, max);
items[i].producent[max - 1] = '\0';

此外,您还应该检查 strtok 是否返回 NULL。如果是的话,那意味着该行不具有您正在寻找的格式。在这种情况下您可以忽略该行并阅读下一行。

关于c - 几乎完成了基于 int 的排序(我希望)。我在声明变量时遇到了一些最后的麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48452089/

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