簡體   English   中英

在C中任意數量的空格上分割字符串

[英]Split string on any number of white spaces in C

我有一個文件,其中每個用戶名和密碼都用不同數量的空格分隔。

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拆分字符串,但它不接受正則表達式作為分隔符。 我能想到的唯一的其他方法是通過在字符串上循環並在空格后創建2個新的單獨字符串來進行強行強制。 有什么建議么?

您(以及大多數受訪者)對此都過分考慮。 strtok()在一個或多個定界符上定界,因此

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

將完全按照您想要的去做。

如果可用,則可以使用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);
    }
}

在C中任意數量的空格上分割字符串

"*\\\\s"表示對令牌字符編碼的誤解。 "*\\\\s"尋找3個字符*\\s作為標記,當與strtok()一起使用時,沒有一個表示空格。


使用顯式列表解析輸入行中的空白。 確保考慮到輸入行或其他空白行的尾部'\\n'

C中的空格包含許多字符:

標准的空白字符如下:空格( ' ' ),換頁( '\\f' ),換行( '\\n' ),回車( '\\r' ),水平制表符( '\\t' )和垂直標簽( '\\v' )。
C11dr§7.4.1.102

// 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);

這個輸出

username : <bob>
password : <passowrd1    <-- Oops
>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM