【问题标题】:What is wrong with my sscanf format我的 sscanf 格式有什么问题
【发布时间】:2018-07-26 15:22:13
【问题描述】:

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

fgets(somedata, bufferone, stdin);  

如果我 printf '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 表单通过标准输入发送)。

【问题讨论】:

    标签: c string buffer cgi


    【解决方案1】:

    "%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);
    }
    

    【讨论】:

    • 您能否解释/详细说明一下,这里的 n!=2 逻辑是如何工作的,以及 [^&] 是如何工作的。另外,如果您能提供我目前所采用的方法的替代方法,我将不胜感激。
    • @AhmadBilal, sscanf/fscanf 返回成功分配的接收参数的数量。在您的情况下,当usrpass 读取成功时,返回值为2。关于格式说明符的工作原理,我建议阅读the documentation。我重复这些信息没有意义。
    • 使用sscanf 可以满足您在代码中呈现的内容。如果您希望输入更复杂,或者您必须考虑上述格式说明符无法处理的输入,那么您必须使用不同的方法。该方法的外观取决于您希望能够处理的输入类型。我认为它过于宽泛,无法在您原始帖子的上下文中解决。
    • 你所说的 n!=2 很有帮助,我对此不再怀疑。关于替代方法是合理的,所以我不会问你更多。但是关于格式说明符,我确实查看了文档,但无法理解。我认为您指的是 [set] 修饰符?能不能简单的说几句。顺便说一句,我认为 %s 修饰符读取到字符串末尾而不是直到 '&' 是正确的吗?
    • @AhmadBilal,我稍微更新了答案。希望这就是你要找的。而且,是的,最后一句话。
    猜你喜欢
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多