【问题标题】:Using "fscanf" in C How can Split two strings?在 C 中使用“fscanf”如何拆分两个字符串?
【发布时间】:2013-10-22 07:24:39
【问题描述】:

我想在 C 中使用文件操作创建一个链表。我想得到一条线并将其拆分并存储在结构中。但我不能拆分两个字符串。

我的文件是这样的:

1#Emre#Dogan
2#John#Smith
3#Ashley#Thomas
等等...

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

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

但结果是

编号:1
名称:Emre#Dogan

如何去掉name中的那个#元素,拆分成name和surname;

【问题讨论】:

标签: c list linked-list scanf strtok


【解决方案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

编辑: 将变量“数字”从字符串转换为整数。

【讨论】:

  • 但是这个程序仍然只显示我的姓氏和数字.. 并将其拆分。数量:1 Emre DOGAN 2 Emre GAN 3 Emre N 4 Emre DOGN 等。
  • @EmreDoğan 上面的程序只从输入文件指针中读取一行。您必须编写一个循环来读取所有行,然后使用 strtok 相应地处理它。我建议您在开始更新程序之前阅读 fgets 和 strtok 的手册页。如果您在实现您的想法时发现任何困难,您可以将其与代码示例一起发布在这里,我随时准备为您提供帮助!
【解决方案2】:

最好使用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 old\n", name, surname, age);
  }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 2018-04-20
    相关资源
    最近更新 更多