在C中的任意数量的空格上拆分字符串

时间:2018-05-12 19:54:07

标签: c file parsing

我有一个文件,其中每个用户名和密码由不同数量的空格分隔。

bob    passowrd1
saly password2
sam      password2

void parse()
{
    FILE*open;
    open = fopen("file.txt");
    char line[101];
    char*name;
    char*password;

    while(fgets(100,line,open)!=NULL)
    {
       name = strtok(line,"*\\s");
       password = strtok(NULL,"*\\s");
       printf("username : %s",name);
       printf("password : %s",password); 
    }
}

我尝试使用strtok拆分字符串,但它不接受正则表达式作为分隔符。我能想到这样做的唯一另一种方式是通过在字符串上进行forlooping并在空格之后创建2个新的单独字符串来强制执行。有什么建议吗?

3 个答案:

答案 0 :(得分:3)

你(和大多数受访者)都在思考这个问题。 strtok()在一个或多个分隔符上分隔,所以

name = strtok(line," ");
password = strtok(NULL," ");

将完全按照您的意愿行事。

答案 1 :(得分:0)

如果可用,您可以使用strsep(字符串分开)。 strsep采用一组分隔符,并逐步将字符串分隔成字段。它优于strtok,因为它不会保持隐藏的全局状态。

void split_fields_strsep( char *string ) {
    char *field;
    const char *delimiters = " \t\n";

    while( (field = strsep(&string, delimiters)) != NULL ) {
        // Multiple spaces will show up as multiple empty fields.
        // Skip them.
        if( *field == '\0' ) {
            continue;
        }

        printf("field: '%s'\n", field);
    }
}

请注意,每个field都是指向原始string的指针。 strsep将字符串拆分为字段,方法是在每个字段的末尾放置空字节。如果stringfoo bar baz \0,您将以foo\0bar\0 baz\0 \0结束。因此,如果要保留字符串,请务必strdup

如果strsep不可用,标准strtok将有效。它与strsep的工作方式类似,并通过添加空字节来改变原始字符串。

void split_fields_strtok( char *string ) {
    const char *delimiters = " \t\n";

    for(
        char *field = strtok(string, delimiters);
        field != NULL;
        field = strtok(NULL, delimiters)
    ) {
        printf("field: '%s'\n", field);
    }
}

答案 2 :(得分:0)

  

在C

中的任意数量的空格上拆分字符串

"*\\s"表示对如何编码令牌字符的误解。 "*\\s"查找3个字符*\s作为令牌,当与strtok()一起使用时,这些字符均不表示空格。

使用显式列表解析白色空间的输入行。请务必考虑输入行或其他空白的尾随'\n'

C中的

空格包含许多字符:

  

标准空格字符如下:空格(' '),换页符('\f'),换行符('\n'),回车符({{1} }),水平标签('\r')和垂直标签('\t')   C11dr§7.4.1.102

'\v'

或者,在// while(fgets(100,line,open)!=NULL) while(fgets(line, sizeof line, open)) { // Destination array is first argument const char *standard_white_space = " \f\n\r\t\v"; name = strtok(line, standard_white_space); password = strtok(NULL, standard_white_space); printf("username : <%s>\n",name); printf("password : <%s>\n",password); } 中使用isspace()" "

提示:为了确保代码在sscanf()中不包含空格,请使用username, password这样的标记字符打印字符串,以便更轻松地检测编码错误。

<>

此输出

  char line[] = "bob    passowrd1\n";
  char*name = strtok(line, " ");
  char* password = strtok(NULL, " ");
  printf("username : <%s>\n", name);
  printf("password : <%s>\n", password);