scanf在C中有多个分隔符

时间:2018-03-20 16:47:19

标签: c struct scanf delimiter

我有一个数据文件,其中包含由单个逗号和随机数字空格分隔的字符串,浮点数和整数。 例如:

john    , smith ,  3.87 ,  2,  6

我想将每个值扫描到包含str,str,float,int,int和amp;的结构中。忽略逗号和空格。我已经想到浮动,但似乎无法得到整数。任何帮助将不胜感激我的代码如下:

typedef struct applicant {  
char first[15]; 
char last[15];
float gpa;
int grev;
int greq;
} num1;

int main(int argc, char *argv[])
{
  FILE *in, *out;
  in = fopen(argv[1], "r");
  out = fopen(argv[2], "w");

  num1 class[10];

  int i;

  fscanf(in, "%[^,],%[^,],%f, %d, %d\n", class[i].first, class[i].last, &class[i].gpa, &class[i].grev, &class[i].greq);
  fprintf(out, "%s %s %f %d %d", class[i].first, class[i].last, class[i].gpa, class[i].grev, class[i].greq);

2 个答案:

答案 0 :(得分:2)

sturcotte06所述,您应使用strtok()功能以及atoi()atof()来获得预期结果。

char text[] = "john    , smith ,  3.87 ,  2,  6";

strcpy(class[i].first, strtok(text, ","));
strcpy(class[i].last, strtok(NULL, ",");
class[i].gpa = atof(strtok(NULL, ","));
class[i].grev = atoi(strtok(NULL, ","));
class[i].greq) = atoi(strtok(NULL, ","));

答案 1 :(得分:1)

我建议采用以下方法。

  1. 逐行阅读文件内容。
  2. 我假设白色空间不相关。如果确实如此,请用空格替换逗号字符。
  3. 使用更简单的格式从文本行读取结构中的数据。
  4. 始终检查从输入流中读取数据的函数的返回值,以确保仅在读取操作成功时才​​使用数据。

    // Make it big enough for your needs.
    #define LINE_SIZE 200
    
    char line[LINE_SIZE];
    if ( fgets(line, LINE_SIZE, in) != NULL )
    {
       // Replace the commas by white space.
       char* cp = line;
       for ( ; *cp != '\0'; ++cp )
       {
          if ( *cp == ',' )
          {
             *cp = ' ';
          }
       }
    
       // Now use sscanf to read the data.
       // Always provide width with %s to prevent buffer overflow.
       int n = sscanf(line, "%14s%14s%f%d%d",
                      class[i].first,
                      class[i].last,
                      &class[i].gpa,
                      &class[i].grev,
                      &class[i].greq);
    
       // Use the data only if sscanf is successful.
       if ( n == 5 )
       {
          // Use the data
       }
    }