scanf可以识别字符串中的格式字符吗?

Ori*_*ski 1 c string scanf

假设我希望标准输入中的项目列表是分开的购买逗号,如下所示:

 item1, item2, item3,...,itemn
Run Code Online (Sandbox Code Playgroud)

我还想允许用户在项目和逗号之间发出空格,所以这种输入在我的程序中是合法的:

item1,item2,item3,...,itemn
Run Code Online (Sandbox Code Playgroud)

如果我这样使用scanf:

scanf("%s,%s,%s,%s,...,%s", s1, s2, s3, s4,...,sn);
Run Code Online (Sandbox Code Playgroud)

当没有空格(我测试过它)时它会失败,因为它会将整个输入称为一个字符串.那么如何才能用C标准库函数解决这个问题呢?

小智 8

快速回答永远不会使用scanf来读取用户输入.它用于从文件中读取严格格式化的输入,即使这样也不是很好.至少,您应该读取整行,然后使用sscanf()解析它们,这样您就有机会纠正错误.最好你应该编写自己的解析函数

如果您实际使用的是C++,请研究c ++字符串和流类的使用,这些类更强大,更安全.


Reu*_*nen 7

你可以看看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);
}
Run Code Online (Sandbox Code Playgroud)

但是,strtok您需要了解与重入相关潜在问题.