我很抱歉这个草率的标题,但我不知道如何正确地格式化我的问题。我正在尝试读取.txt,其中每行都有填充结构所需的信息。首先,我使用fgets
来读取该行,然后我将使用sscanf
来阅读各个部分。现在这里是我被困住的地方:通常sscanf
在空白处打破部分,但我需要包含空格。我知道sscanf
允许忽略空格,但棘手的部分是我需要一些其他任意字符来分隔部分。例如,我必须打破这一行
Carl Sagan~联系~scifi~1997
到Author,Name,Genre,year
的部分。你可以看到我需要Carl Sagan
中的空格,但我需要这个函数来中断波形符号上的字符串。任何帮助表示赞赏
答案 0 :(得分:2)
如果您的输入由~
分隔,或者例如任何特定字符:
使用此:
sscanf(s, "%[^~]", name);
[^
是转换类型,匹配除列出的字符以外的所有字符,以]
结尾
以下是用于测试的示例program:
#include <stdio.h>
int main(int argv, char **argc)
{
char *s = "Carl Sagan~Contact~scifi~1997";
char name[100], contact[100], genre[100];
int yr;
sscanf(s, "%99[^~]~%99[^~]~%99[^~]~%d", name, contact, genre, &yr);
printf("%s\n%s\n%s\n%d\n", name, contact, genre, yr);
return 0;
}
答案 1 :(得分:0)
您需要strtok
。使用~
作为分隔符。
请参阅文档:http://linux.die.net/man/3/strtok
strtok
有一些缺点,但听起来它会对你有用。
编辑:
在阅读this之后,听起来你可以巧妙地使用sscanf
来获得相同的结果,毕竟它实际上可能更安全。
答案 2 :(得分:0)
#include <stddef.h>
#include <string.h>
#include <stdio.h>
char* mystrsep(char** input, const char* delim)
{
char* result = *input;
char* p;
p = (result != NULL) ? strpbrk(result, delim) : NULL;
if (p == NULL)
*input = NULL;
else
{
*p = '\0';
*input = p + 1;
}
return result;
}
int main()
{
char str[] = "Carl Sagan~Contact~scifi~1997";
const char delimiters[] = "~";
char* ptr;
char* token;
ptr = str;
token = mystrsep(&ptr, delimiters);
while(token)
{
printf("%s\n",token);
token = mystrsep(&ptr, delimiters);
}
return 0;
}
输出: -
Carl Sagan
Contact
scifi
1997