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

时间:2014-10-22 22:20:50

标签: c arrays string

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

名称1.52
其他名称2.42
......等等

现在我将这些字符串和浮点数复制到数组中,所以我可以稍后在我的代码中使用它们。问题是,我无法在我的代码中的其他地方分配我的数组文本文件中找到的字符串。数组具有空间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]
首先,我初始化它们(这现在发生在main函数中,它调用read_pricelist函数)

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

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

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

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

1 个答案:

答案 0 :(得分:3)

你的功能有问题:

  1. 关于警告,您将char (*)[100]作为格式化目标传递,期望目标为char *。您应该传递的值是需要填充的第N个元素的基址。
  2. while (!feof(fp)...)错误Read this to see why.
  3. 结合上述内容,您永远不会验证fscanf实际上工作。相反,你假设它做了并盲目地将不确定的数据输入到输出缓冲区。首次进入循环时,这尤其危险。如果第一个fscanf无法解析任何内容,则数组a[]将完全不确定,随后的strcpy将搜索终止符以停止,但在{{1}中没有填充有效字符串用它来做。如果你是(非)幸运的话,它会在前100个字符中的某个地方使用空字节a,但这种行为是完全未定义的。
  4. 您可以通过全开0x00格式让自己处于可能的缓冲区溢出状态。它应该是长度有限的。
  5. 你不必要地将数据读入临时数据库。 %s可以直接在输出目标中读取格式正确的数据;不需要中间目标和复制。
  6. 应用上述所有功能可以在显着减少代码负载的同时完成,值得考虑:

    fscanf

    还有更多可以做的事情,但这会让你在未来的道路上走得更远。