我的sscanf格式有什么问题

我的sscanf格式有什么问题,c,string,buffer,cgi,C,String,Buffer,Cgi,我在这里尝试用c语言处理表单数据 fgets(somedata, bufferone, stdin); 如果我打印“somedata”,我会得到: username=John&password=hispass123 现在当我尝试使用 char usr[100], pass[100]; sscanf(somedata, "username=%s&password=%s", usr, pass); printf("Content-type: text/html\n\n");

我在这里尝试用c语言处理表单数据

fgets(somedata, bufferone, stdin);  
如果我打印“somedata”,我会得到:

username=John&password=hispass123
现在当我尝试使用

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发送)

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

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

要使代码更加健壮,请始终检查
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);
}
“%s”
是贪婪的。它拾取其路径中不是空白字符的所有内容。将其更改为使用
“%[^&]”

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

要使代码更加健壮,请始终检查
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);
}

你能解释一下吗=2逻辑在此工作,以及[^&]的工作方式。另外,如果您能提供一种替代我目前所采用的方法,我将不胜感激。@AhmadBilal,
sscanf/fscanf
返回成功分配的接收参数数。在您的情况下,当成功读取
usr
pass
时,返回值将为2。关于格式说明符如何工作,我建议阅读。重复这些信息对我来说没有意义。使用
sscanf
可以满足您在代码中所呈现的内容。如果您希望输入更加复杂,或者您必须考虑上述格式说明符无法处理的输入,那么您必须使用不同的方法。这种方法的效果取决于您希望能够处理的输入类型。我认为它太宽泛了,无法在你原来的帖子中提及=2是有帮助的,我对此不再怀疑。关于替代方法是合理的,所以我不会问你们更多。但是关于格式说明符,我确实查看了文档,但无法理解它。我想你指的是[set]修饰符?你能用几个简单的词来表达吗。顺便说一句,我认为%s修饰符应该一直读到字符串的末尾,而不是像我预期的那样读到“&”吗?@AhmadBilal,我更新了一点答案。希望这就是你想要的。最后一句话是肯定的。你能解释一下吗=2逻辑在此工作,以及[^&]的工作方式。另外,如果您能提供一种替代我目前所采用的方法,我将不胜感激。@AhmadBilal,
sscanf/fscanf
返回成功分配的接收参数数。在您的情况下,当成功读取
usr
pass
时,返回值将为2。关于格式说明符如何工作,我建议阅读。重复这些信息对我来说没有意义。使用
sscanf
可以满足您在代码中所呈现的内容。如果您希望输入更加复杂,或者您必须考虑上述格式说明符无法处理的输入,那么您必须使用不同的方法。这种方法的效果取决于您希望能够处理的输入类型。我认为它太宽泛了,无法在你原来的帖子中提及=2是有帮助的,我对此不再怀疑。关于替代方法是合理的,所以我不会问你们更多。但是关于格式说明符,我确实查看了文档,但无法理解它。我想你指的是[set]修饰符?你能用几个简单的词来表达吗。顺便说一句,我认为%s修饰符应该一直读到字符串的末尾,而不是像我预期的那样读到“&”吗?@AhmadBilal,我更新了一点答案。希望这就是你想要的。最后一句话是肯定的。