gpt4 book ai didi

c - 在 C 中传递字符串并填充它们

转载 作者:太空宇宙 更新时间:2023-11-04 07:13:37 25 4
gpt4 key购买 nike

所以我试图打开一个文本文件,它看起来像这样:

名字 1.52
其他名称 2.42
……等等

现在我必须将这些字符串和 float 复制到数组中,这样我以后就可以在我的代码中处理它们了。问题是,我无法分配在文本文件数组中找到的字符串,而我在代码中的其他地方需要这些字符串。数组的空格为 100,因为这应该是我允许的最大长度。我知道问题出在这里

char a[100];

这里

fscanf(fp, "%s %f\n", &a, &b);

我怎样才能将我的空数组正确地传递给 fscanf 函数,以便它可以被“填充”?
我不断收到类似
“警告:格式指定类型‘char ’但参数的类型为‘char ()[100]’[-Wformat]”的错误

/* reads the list into the arrays name and prices and returns the number of lines (i.e.
elements) that have been read */

int read_priceList(const char* path, char names[100][100],
float price[100]){
FILE *fp = fopen(<path>, "r");

char a[100];
float b;
int i = 0;

if(fp == NULL) {
perror("Error opening File");
return -1;
}
while (!feof(fp) && i < 100) {
fscanf(fp, "%s %f\n", &a, &b);
strcpy(names[i], &a);
price [i] = b;
i++;
}
i--;
fclose(fp);
return i;
}

另外在我的代码后面我想将一个空的二维字符串数组传递给这个函数,这也是一个问题......
警告:不兼容的指针类型将 'char ' 传递给 'char ()[100]
类型的参数首先,我初始化它们(这现在发生在调用 read_pricelist 函数的 main 函数中)

char namesPricelist[100][100];
float prices[100];

然后我想调用 readPricelist 函数并为它们提供这些参数。

readPricelist(<path>, &namespricelist[0][0], &prices[0]);

我开始失去理智,请帮助...

最佳答案

您的函数存在的问题包括:

  1. 关于警告,您将 char (*)[100] 作为格式化目标传递,期望目标为 char *。您应该传递的值是需要填充的第 N 个元素的基址。
  2. while (!feof(fp)...) 错误 Read this to see why.
  3. 结合上述内容,您从未验证过 fscanf 实际上确实有效。相反,您假设它确实存在并盲目地将不确定的数据扔到您的输出缓冲区中。当第一次进入循环时,这尤其危险。如果第一个 fscanf 无法解析任何数组 a[] 将完全不确定,随后的 strcpy 将搜索终止符以停止, 但在 a 中没有填充有效字符串来执行此操作。如果你(不)幸运,它会在前 100 个字符内的某处罚款空字节 0x00,但这种行为是完全未定义的。
  4. 您使用完全开放的 %s 格式让自己面临潜在的缓冲区溢出。它应该有长度限制。
  5. 您不必要地将数据读取到临时文件中。 fscanf 可以直接在输出目标中读取格式正确的数据;不需要中间目标和复制。

应用上述所有方法可以显着减少代码负载,值得考虑:

int read_priceList(const char* path, char names[100][100], float price[100])
{
FILE *fp = fopen(path, "r");
int i = 0;

if(fp == NULL)
{
perror("Error opening File");
return -1;
}
while (i<100 && fscanf(fp, "%99s %f", names[i], price+i) == 2)
++i;

fclose(fp);
return i;
}

还有很多事情可以做,但这应该会让您走得更远。

关于c - 在 C 中传递字符串并填充它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26518130/

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