如何扫描一个浮点然后紧跟c中的字母'e'?

use*_*696 13 c gcc scanf format-specifiers

我正在尝试使用fscanf读取数据,'e'例如,输入的一部分是一个浮点数后跟字母41.72elapsed.在编写strng时fscanf,我尝试使用"%felapsed",但这不起作用,就像%fe它自己的格式说明符一样.我怎么用这个来读fscanf

编辑:这是代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define CHAR_MAX 1024

int main(int argc, char **argv)
{
    FILE *file_in = fopen(argv[1], "r+");
    char out_name[CHAR_MAX];
    strcpy(out_name, argv[1]);
    strcat(out_name, ".csv");
    FILE *csv_out = fopen(out_name, "w");
    int minutes;
    float seconds;
    fprintf(csv_out, "Trial #, Execution Time\n");

    for (int i = 0; fscanf(file_in, "%*fuser %*fsystem %d:%felapsed %*d%%CPU (%*davgtest+%*davgdata %*dmaxresident)k\n%*dinputs+%*doutputs (%*dmajor+%*dminor)pagefaults %*dswaps\n", &minutes, &seconds) == 2; i++) {
         fprintf(csv_out, "%d, %d:%.2f\n", i, minutes, seconds);
     };
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

以下是一些示例输入:

283.97user 0.69system 1:13.77elapsed 385%CPU (0avgtext+0avgdata 107472maxresident)k

0inputs+4616outputs (0major+9550minor)pagefaults 0swaps

287.87user 0.35system 1:14.41elapsed 387%CPU (0avgtext+0avgdata 107328maxresident)k

0inputs+4616outputs (0major+9524minor)pagefaults 0swaps
Run Code Online (Sandbox Code Playgroud)

chu*_*ica 6

这是一个问题 scanf()

FP格式就像"%f"看到e引入取幂一样.由于e后面没有数字,扫描float停止.但是scanf()已经准备好扫描了一个e并且C不需要scanf()能够备份超过1个字符.因此使用简单的代码就是运气不佳"%f".

某些系统将备份超过1个字符,但C不需要该功能.

代码需要一种新方法 - 以秒为单位扫描字符串

char sec[20];
int cnt = fscanf(file_in, "%d:%19[0-9. ]elapsed", &minutes, sec);
if (cnt == 2) {
  seconds = atof(sec); 
  ...
}
Run Code Online (Sandbox Code Playgroud)


Som*_*ude 4

根本不需要"elapsed"您的格式。该函数scanf将从输入中读取尽可能长的内容,对于浮点数,当遇到非数字字符(即 in )时,它将停止e读取elapsed

所以格式只需要是"%f",仅此而已。IE

float value;
fscanf(file, "%f", &value);
Run Code Online (Sandbox Code Playgroud)

如果您想读取并丢弃该elapsed部分,请使用"%*s",星号告诉scanf(和系列)读取并忽略其余部分,因此完整的调用看起来像

float value;
fscanf(file, "%f%*s", &value);
Run Code Online (Sandbox Code Playgroud)

看到你的代码后,使用类似的东西可以变得更加简单和容易

char input[512];
for (int i = 0; fgets(input, sizeof input, file_in) != NULL; ++i) {
    if (sscanf(input, "%*f%*s %*f%*s %d:%f%*s", &minutes, &seconds) == 2) {
        fprintf(csv_out, "%d, %d:%.2f\n", i, minutes, seconds);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于此循环使用fgets而不是直接循环,因此fscanf您将读取输入文件中的所有行,而不仅仅是第一行。另外,由于fgets使用了 ,我们不需要该sscanf函数来实际解析我们不需要的字符串部分(这是其中的大部分),而是我们只解析sscanf输入字符串,直到获得我们需要的数据。

  • Joachim,看来他的实现/编译器/库正在使用“e”作为科学记数法的开头。然后继续阅读失败,但它不会推回“e”。 (2认同)