在 C 中使用 "fscanf" 如何拆分两个字符串?



我想使用文件操作在 C 中建立链表。我想得到一条线并将其拆分并存储在结构器中。但我不能分开两根绳子。

我的文件是这样的:

1#埃姆雷#多根
2#约翰#史密斯
3#阿什利#托马斯
等...

我想使用 fscanf 从文件中读取一行。

fscanf(file,"%d#%s#%s",&number,name,surmane);

但结果是

人数 : 1
姓名 : 埃姆雷#多根

如何摆脱名称中的#元素并将其拆分为名称和姓氏;

#include <stdio.h>
#include <string.h>
int main(void) {
    FILE *fptr;
    fptr = fopen("Input.txt", "r");
    int number;
    char *name;
    char *surname;
    char line_data[1024];
    fgets(line_data, 1024, fptr);
    number = atoi(strtok(line_data, "#"));
    name = strtok(NULL, "#");
    surname = strtok(NULL, "#");    
    printf("%d %s %s", number, name, surname);
}

输出:

1 Emre Dogan

编辑:将变量"数字"从字符串覆盖为整数。

最好使用 fgets() 读取一整行,然后解析该行。这更健壮,由于跳过空格的方式fscanf()直接在输入流上使用fscanf()可能会令人困惑。

因此,您可以执行以下操作:

char line[1024];
if(fgets(line, sizeof line, file) != NULL)
{
  int age;
  char name[256], surname[256];
  if(sscanf(line, "%d#%255[^#]#%255s", &age, name, surname) == 3)
  {
    printf("it seems %s %s is %d years oldn", name, surname, age);
  }
}

这将使用%[]格式说明符来避免在分析的字符串中包含#分隔符。我认为这比strtok()更干净,这是一个最好避免的可怕功能。

相关内容

  • 没有找到相关文章

最新更新