我试图分析一堆字符串与sscanf在c;
字符串的格式如下:(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 %sn", meg, star);
}
}
return 0;
}
这工作!但有时名称可以由两个单词组成,而%s实际上只能看到第一个单词,因此我应该使用[^]说明符。所以我写:
sscanf(phrase, "%f %[^1234567890] %f", &meg, star, &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 filen");
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' %gn", meg, star, dist);
}
}
return 0;
}
你给的输入对我有效。