为什么 [^] sscanf 说明符会破坏我的程序? C

问题描述

我正在尝试用 c 中的 sscanf 分析一堆字符串;

字符串的格式如下:(float) (name) (float)

example: 
-26.73 Sun 0.000016 
-0.27 Alpha Centauri    4.4 

所以我这样设置我的代码

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

#define WORD 50
#define PHRASE 150

int main (int argc,char *argv[]){
    char frase [PHRASE+1]= "";
    char star[WORD+1]= "";
    char mom [WORD+1]= "";
    float meg=0,dist=0;
    int ins=0;
    
    FILE *fp;
    
    fp = fopen("stelle.txt","r");

    if (argc==1){
    }
    
    sscanf(argv[1],"%[1234567890]",mom);
    ins=atoi(mom);
    
        while (fgets(frase,PHRASE,fp)){
            sscanf(frase,"%f %[^ 1234567890] %f",&meg,star,&dist);
            if (ins==0){
                if ((strcmp(argv[1],star))==0)
                    printf("%g %g",meg,dist);
            }
            
            else {
                if (ins>dist)
                    printf("%g %s\n",star);
            }
        }
    
    return 0;
    }

这有效!但有时名称可以由两个词组成,而 %s 只能真正看到第一个词,所以我应该使用 [^] 说明符。 所以我写:

    sscanf(phrase,"%f %[^1234567890] %f",&dist)

并且这段代码确实破坏了程序并使其崩溃,我真的不知道为什么,但是如果我写 %[^ 1234567890] 它又可以工作了,但这并没有真正解决我的问题,那是什么在这里进行吗?问题出在哪里?

解决方法

有很多看起来像是诊断代码和其他调试碎片的东西干扰了您的程序的运行。我已经在这里清理了:

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

#define WORD 50
#define PHRASE 150

int main (int argc,char *argv[]) {
  FILE *fp = fopen("stelle.txt","r");

  if (!fp) {
    // Referencing a NULL pointer later on will result in an immediate crash
    // so this error indicates trouble and exits.
    printf("Could not open file\n");

    return -1;
  }

  char line[PHRASE+1];
  while (fgets(line,PHRASE,fp)) {
    char star[WORD+1];
    float meg;
    float dist;

    int srv = sscanf(line,"%f %[^1234567890] %f",&meg,star,&dist);

    if (srv == 3) {
      printf("%g '%s' %g\n",meg,dist);
    }
  }

  return 0;
}

这适用于您提供的输入。