让我们说,我希望从中分离买逗号,这样的标准输入的项目清单:

 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]的” 匹配的字符串,如 “你好,世界”, “你好,世界”, “你好,世界”。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top