【问题标题】:C - fscanf to read two ints and then stringsC - fscanf 读取两个整数,然后是字符串
【发布时间】:2012-11-19 14:35:23
【问题描述】:

我需要在一个文本文件中存储两个整数,然后是文本行。我已经通过将每个 int 写在一行中并将每一行文本也写在一个新行中来成功地做到了这一点。然而,为了阅读它,我发现了一些麻烦。我正在这样做:

FILE *f = fopen(arquivo, "r");
char *lna = NULL;
fscanf(f, "%d\n%d\n", &maxCol, &maxLin);
//↑This reads the two ints, works fine in step-by-step
for (;;) {
    fscanf(f, "%s\n", &lna);
    //↑This sets lna to NULL always, even if there are more lines
    if (lna != NULL)
        lna[strlen(lna) - 1] = '\0';
    if (feof(f))
        break;
    inserirApos(lista, lna, &atual);
}
fclose(f);

我尝试了几种不同的方法,但都没有奏效。我知道我可以读取字符串,gets 或其他东西,但我认为如果字符串包含空格,则会出现问题。我想知道我正在做的方式是否是最好的,以及它有什么问题。我发现其中一种方法(也不起作用)你必须通过每行的最大长度。如有必要,我知道此信息,这是我之前阅读的 maxCol。

【问题讨论】:

    标签: c file io scanf


    【解决方案1】:
    fscanf(f, "%s\n", &lna);
    

    是错误的参数类型。 %s 格式需要 char* 作为参数,但您给了它 char**。而且您还没有为该指针分配内存。 fscanf 期望 char* 指向足够大的内存区域。

    char *lna = malloc(whatever_you_need);
    ...
        fscanf("%s ", lna);
    

    '\n'' 'fscanf 格式中没有区别。两者都占用扫描 int lna 的非空白字符字符串之后的整个空白。)

    【讨论】:

    • 谢谢!那是我的两个错误。现在它完美运行了!
    【解决方案2】:

    您似乎期待fscanf() 为您动态分配字符串;这根本不是它的工作原理。这是未定义的行为。

    【讨论】:

      【解决方案3】:

      你需要先为 lna 分配空间。

      char *lna = malloc(MAX_SIZE);//MAX_SIZE is the maximum size the string can be + 1 
      

      附加参数应指向已分配的对象,其类型由格式字符串中的相应格式说明符指定。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 2012-07-17
      • 1970-01-01
      相关资源
      最近更新 更多