【问题标题】:How to use strtok() to split the given string containing spaces into multiple strings?如何使用 strtok() 将包含空格的给定字符串拆分为多个字符串?
【发布时间】:2020-08-20 07:49:55
【问题描述】:

我有一个名为 email.txt 的文件,其中包含一些文本。我正在尝试将包含空格的给定字符串拆分为多个字符串。我编写的程序没有将单词分成单独的行。它给了我文件最后一个单词的输出。 这是我的代码

#include <stdio.h>
#include <string.h>
#define MAXCHAR 1000
int main()
{
    FILE *fp2;    
    char str2[MAXCHAR];
    int line = 0;
    char delim[] = " ";
    int init_size = strlen(str2);
    fp2 = fopen("email.txt","r");
    while( fgets( str2, MAXCHAR, fp2 )) {
        line++;
        // printf(" %s",str2);  
    }
    char *ptr = strtok(str2, delim);
    
    while(ptr != NULL)
    {
        printf("%s\n", ptr);
        ptr = strtok(NULL, delim);
    }       
    
    return 0;
}

【问题讨论】:

  • 如果域名之间用空格隔开可以使用fscanf(fp2, "%s", str2)
  • “我写的程序没有给我想要的输出。它不工作。”这不是一个有用的问题描述。它输出的是什么?你提供什么输入?您对该样本输入的期望输出是什么?
  • 你可以在这里找到解决方案stackoverflow.com/questions/2523467/…
  • str2 仍未初始化时,您执行strlen(str2)。这会导致未定义的行为
  • 您可以使用 String Literal 表示 delim,例如const char *delim = " ";,但您可能还想添加'\t''\n',因此如果分隔符是tab,您的解析仍然有效,'\n' 确保您从最后一个域中修剪'\n',例如const char *delim = " \t\n";

标签: c split strtok


【解决方案1】:

首先循环遍历文件中的所有行,然后然后循环遍历strtok() 返回。这意味着您只需要标记 last 读取的行。

您需要嵌套这些循环——读取一行,标记化,然后读取下一行。

while( fgets( str2, MAXCHAR, fp2 )) {
    char * ptr;
    line++;
    //  printf(" %s",str2);
    ptr = strtok(str2, delim);

    while(ptr != NULL)
    {
        printf("%s\n", ptr);
        ptr = strtok(NULL, delim);
    }
}

【讨论】:

    【解决方案2】:

    你可以遍历所有字符然后输出一个

    • 你刚刚读到的字符或
    • 如果字符是空格,则为换行符

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 2023-03-13
      相关资源
      最近更新 更多