在字符串上使用sscanf时,如何准确使用(否定的)字符类或扫描集?

时间:2018-12-25 17:43:29

标签: c scanf

我有多行字符串,我想以以下形式存储它:

string1   string2   float1   float2   float3   float4   float5   float6

,如下面提到的转换说明符所示。例如:

Kevlar ABS 43.42 13.94 1.35 0.35 0.112 2.74

两个字符串是Kevlar和ABS,其余6个是数字。所有这8个字符之间都有空格字符。

我想知道如何仅使用扫描集或(否定的)字符类在所有8个转换说明符中存储所需的信息。

该结构声明如下:

 struct lamina
 {
    char lamina_fiber[30];
    char lamina_matrix[30];
    float E1,E2,p,v12,v21,G12;
    struct lamina *nextnode;
 };


 head=(struct lamina *)calloc(1,sizeof(struct lamina));
 current=head;

 for(int i=1;i<=index_elements;i++)
 {
     sscanf(rows[i],"%s %s %f %f %f %f %f %f", 
            current->lamina_fiber,current->lamina_matrix,&current->E1, 
            &current->E2,&current->p,&current->v12,&current->v21, 
            &current->G12);
     current->nextnode=(struct lamina *)calloc(1,sizeof(struct lamina));
     current=current->nextnode;
 }

 current=head;

 for(int i=1;i<=index_elements;i++)
 {
       printf("%s %s %f %f %f %f %f %f", current->lamina_fiber, current->lamina_matrix,
              current->E1, current->E2,current->p, current->v12,  
              current->v21, current->G12);
       current=current->nextnode;
 }

注意:问题中的代码的第1版:

if(n=(sscanf(rows[i],"%s %s %5.2f %5.2f %5.2f %5.2f %5.2f %5.2f", 
current->lamina_fiber,current->lamina_matrix,&current->E1, 
&current->E2,&current->p,&current->v12,&current->v21,&current->G12))!=8);

这解释了对if的引用以及答案中的后跟分号。

1 个答案:

答案 0 :(得分:1)

条件语句有两个问题。您的状况,

@RequestMapping(value = "/carSave", method = RequestMethod.POST)
public ModelAndView doHomeSave(@RequestParam("carID") String carID,
                               @RequestParam("culoarea") String culoarea,
                               @RequestParam("model") String model,
                               @RequestParam("combustibil") String combustibil,
                               @RequestParam("categoria") String categoria,
                               @RequestParam("data_inregistrarii") 
                               // Add this format
                               @DateTimeFormat(iso = ISO.DATE) LocalDate data_inregistrarii) { 

  // code here

}

看起来它为n=(sscanf(rows[i],"%s %s %5.2f %5.2f %5.2f %5.2f %5.2f %5.2f", current->lamina_fiber,current->lamina_matrix,&current->E1, &current->E2,&current->p,&current->v12,&current->v21,&current->G12))!=8 分配了sscanf(应该为8)的返回值,然后检查该返回值是否应为8。但实际上,它还有其他作用:它将条件的结果分配给n

n

应为(sscanf(rows[i],"%s %s %5.2f %5.2f %5.2f %5.2f %5.2f %5.2f", current->lamina_fiber,current->lamina_matrix,&current->E1, &current->E2,&current->p,&current->v12,&current->v21,&current->G12))!=8 ,或者由于true是整数1。

下一个问题是您的n条件以if结尾,因此没有任何事情可以完成或不依赖它。您的程序仅继续执行以下两个语句:第一次打印

  

问题!n = 1

,然后打印原始输入字符串;