题
让我们说,我希望从中分离买逗号,这样的标准输入的项目清单:
item1, item2, item3,...,itemn
我也希望允许用户发出项目和逗号之间的空格,所以这种投入是合法的在我的计划:
item1,item2,item3,...,itemn
如果我使用scanf
这样的:
scanf("%s,%s,%s,%s,...,%s", s1, s2, s3, s4,...,sn);
它会在没有白空间(I测试它),因为它会指整个输入作为一个字符串失败。所以,我怎么能只使用C标准库函数解决这个问题?
解决方案
您可以看看 strtok
。第一读出的线成一个缓冲区,然后标记化:
const int BUFFERSIZE = 32768;
char buffer[BUFFERSIZE];
fgets(buffer, sizeof(buffer), stdin);
const char* delimiters = " ,\n";
char* p = strtok(buffer, delimiters);
while (p != NULL)
{
printf("%s\n", pch);
p = strtok(NULL, delimiters);
}
然而,随着strtok
你需要知道的的到重入相关的潜在问题。
其他提示
在快速的答案是永远不会使用scanf函数读取用户输入。它是用于读取文件严格的格式输入,而且当时是没什么用处。至少,你应该读整行,然后用的sscanf()解析它们,给你一些机会改正错误。充其量,你应该写自己的解析函数
如果你实际使用的是C ++,调查使用了C ++的字符串流类,其功能更加强大和安全。
我想这是最好写这个你自己的分析功能。但是,如果你还是喜欢scanf函数,尽管它的陷阱,你可以做一些变通,刚刚替补%s与%[^,\ t \ r \ n]的。
这非空白字符%s的匹配序列,因此它吞咽问题逗号太。所以,如果你用%[^,\ t \ r \ n]的取代%S,将工作几乎是相同的(不同的是,%S使用isspace为(3)来匹配空格字符,但在这种情况下,您明确指定空格字符匹配并且该列表可能不是相同isspace为)。
请注意,如果你想允许的空间之前和逗号后必须添加空格到你的格式字符串。格式字符串 “%[^ \吨\ r \ n]的%[^ \吨\ r \ n]的” 匹配的字符串,如 “你好,世界”, “你好,世界”, “你好,世界”。
不隶属于 StackOverflow