我有一个文件,其中每个用户名和密码由不同数量的空格分隔。
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个新的单独字符串来强制执行。有什么建议吗?
答案 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
将字符串拆分为字段,方法是在每个字段的末尾放置空字节。如果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);
}
}
答案 2 :(得分:0)
在C
中的任意数量的空格上拆分字符串
"*\\s"
表示对如何编码令牌字符的误解。 "*\\s"
查找3个字符*
,\
和s
作为令牌,当与strtok()
一起使用时,这些字符均不表示空格。
使用显式列表解析白色空间的输入行。请务必考虑输入行或其他空白的尾随'\n'
。
空格包含许多字符:
标准空格字符如下:空格(
' '
),换页符('\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);