C -在sscanf()中使用空格

bvpmtnay  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(265)

我试图解析一个格式为x y z(包括空格)的输入字符串,以便在输入字符串有效时退出循环。然而,当我运行此代码时,它输出“不正确的格式”3次,每次都是valid = 1。有没有其他方法可以让它工作而不必手动解析它?

int valid = 0, x, y, z;
char str[20];
while (valid != 3) {
  scanf("%s", str);
  valid = sscanf(str, "%d %d %d", &x, &y, &z);
  if (valid != 3) {
    printf("Incorrect format\n");
  }
}
2wnc66cl

2wnc66cl1#

在代码中,您创建的主要障碍是尝试使用scanf ("%s", str)进行读取。%s说明符将仅读取遇到的第一个空格之前的字符。如果您输入由空格分隔的3个整数,你将永远不会读取超过第一个到str。这使得它不可能解析3-从strsscanf的整数值,其包含的值不能超过1。
要纠正此问题,可以直接用scanf读取3个整数值,例如:

#include <stdio.h>

int main (void) {
    
    int x, y, z;
    printf ("enter 3 integers: ");
    if (scanf ("%d %d %d", &x, &y, &z) != 3) {
        fprintf (stderr, "error: invalid input.\n");
        return 1;
    }
    printf ("x : %d\ny : %d\nz : %d\n", x, y, z);
    
    return 0;
}

或者,处理面向行的输入的首选方法是使用面向行的输入函数fgets或POSIX getline。这将避免使用scanf获取用户输入的许多陷阱,而这些陷阱是新的C程序员经常陷入的。Never, never, never use gets,它是如此不安全,因此已从C11库中删除。
使用fgetssscanf的等效示例为:

#include <stdio.h>

#define MAXC 128

int main (void) {
    
    int x, y, z;
    char buf[MAXC] = "";
    printf ("enter 3 integers (on a single line): ");
    if (fgets (buf, MAXC, stdin) == NULL) {
        fprintf (stderr, "error: user canceled input.\n");
        return 1;
    }
    if (sscanf (buf, "%d %d %d", &x, &y, &z) != 3) {
        fprintf (stderr, "error: invalid input.\n");
        return 1;
    }
    printf ("x : %d\ny : %d\nz : %d\n", x, y, z);
    
    return 0;
}

使用/输出示例

(it两者相同)

$ ./bin/rd3int
enter 3 integers: 10 12 14
x : 10
y : 12
z : 14

把东西看一遍,如果还有问题就告诉我。

3bygqnnd

3bygqnnd2#

scanf("%s", str)扫描文本,直到出现空格。因此,对于输入1 2 3str被读取3次,内容为123
请尝试改用gets(str)

相关问题