在c中拆分字符串

时间:2013-03-01 07:31:25

标签: c

我有一个文件,每行看起来像这样:

cc ssssssss,n

其中两个第一个'c'是单个字符,可能是空格,然后是一个空格,然后's'是一个长度为8或9个字符的字符串,然后是逗号,然后是整数。

我是c的新手,我正在试图弄清楚如何将每行变为4个单独的变量(前两个字符中的每一个,字符串和数字)

有什么建议吗?我看过fscanf和strtok,但我不知道如何让它们为此工作。

谢谢。

3 个答案:

答案 0 :(得分:5)

我认为这是一个C问题,正如问题所暗示的那样,而不是像标签那样的C ++。

  1. 阅读整行。

  2. 使用strchr查找逗号。

  3. 用前两个字符做任何你想做的事。

  4. 将逗号切换为零,标记字符串的结尾。

  5. 从第四个字符开始调用strcpy以提取sssssss部分。

  6. 在逗号所在的一个字符上调用atoi以提取整数。

答案 1 :(得分:0)

字符串是以第一个'\0'结尾的字符序列。记住这一点。您所描述的文件中的内容不是字符串。

我认为n是一个可以跨越多个小数位的整数,可能是负数。如果是这种情况,我相信您需要的格式字符串是"%2[^ ] %9[^,\n],%d"。您需要传递fscanf以下表达式:

  1. 您的FILE *
  2. 格式字符串
  3. 一组3个字符静默转换为指针
  4. 一组9个字符,默默地转换为指针
  5. ...以及指向int
  6. 的指针

    将fscanf的返回值存储到int中。如果fscanf返回负数,则表示存在EOF或其他读取错误等问题。否则,fscanf会告诉您它为其分配了多少个对象。在这种情况下,您正在寻找的“成功”值是3.其他任何意味着错误形成输入。

    我建议您阅读fscanf manual以获取更多信息和/或澄清。

答案 2 :(得分:0)

fscanf功能非常强大,可用于解决您的任务:

  1. 我们需要阅读两个字符 - 格式为“%c%c”。
  2. 然后跳过一个空格(只需将其添加到格式字符串) - “%c%c”。
  3. 然后读取一个字符串,直到我们点击逗号。不要忘记指定最大字符串大小。因此,格式为“%c%c%10 [^,]”。 10 - 读取最大字符数。 [^,] - 允许的字符列表。 ^, - 表示除逗号外的所有内容。
  4. 然后跳过逗号 - “%c%c%10 [^,],”。
  5. 最后读取一个整数 - “%c%c%10 [^,],%d”。
  6. 最后一步是确保读取所有4个令牌 - 检查fscanf返回值。
  7. 以下是完整的解决方案:

    FILE *f = fopen("input_file", "r");
    
    do
    {
        char c1 = 0;
        char c2 = 0;
        char str[11] = {};
        int d = 0;
    
        if (4 == fscanf(f, "%c%c %10[^,],%d", &c1, &c2, str, &d))
        {
            // successfully got 4 values from the file
        }
    }
    while(!feof(f));
    
    fclose(f);