[英]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
會將字符串拆分為多個字段。 如果string
為foo 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.