我正在尝试在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发送)。
答案 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);
}