我的sscanf格式有什么问题

时间:2018-07-26 15:22:14

标签: c string buffer cgi

我正在尝试在c中处理表单数据。

fgets(somedata, bufferone, stdin);  

如果我打印'somedata',我得到:

username=John&password=hispass123

现在,当我尝试使用sscanf

char usr[100], pass[100];
sscanf(somedata, "username=%s&password=%s", usr, pass);
printf("Content-type: text/html\n\n");
printf("%s is value 1\n", usr);
printf("%s is value 2\n", pass);

比我得到的

John&password=hispass123 is value 1
?? is value 2

我怀疑,第一个调用读取的是空终止符,然后第二个调用溢出或其他原因。

所以我需要有关格式的帮助。另外,在这种情况下sscanf函数是最佳选择吗?我正在尝试从消息正文中获取2个字符串(由html表单通过stdin发送)。

1 个答案:

答案 0 :(得分:3)

"%s"很贪婪。它拾取路径中不是空格字符的所有内容。将其更改为使用"%[^&]"

sscanf(somedata, "username=%[^&]&password=%s", usr, pass);

格式说明符的%[^&]部分将提取不是字符&的所有字符。遇到&时它将停止提取。

要使代码更健壮,请始终检查sscanf/fscanf的返回值。

int n = sscanf(somedata, "username=%[^&]&password=%s", usr, pass);
if ( n != 2 )
{
   // There was a problem reading the data.
}
else
{
   // Reading was successful. Use the data.
   printf("Content-type: text/html\n\n");
   printf("%s is value 1\n", usr);
   printf("%s is value 2\n", pass);
}