C - 在 sscanf() 中使用空格

C - Using spaces in sscanf()

我正在尝试解析格式为 x y z(包括空格)的输入字符串,以便在输入的字符串有效时退出循环。但是,当我 运行 这段代码时,它输出 "incorrect format" 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");
  }
}

scanf("%s", str) 扫描文本直到出现 space。所以对于输入1 2 3str被读取了3次,内容为123.

请尝试使用 gets(str)

在您的代码中,您创建的主要障碍是尝试使用 scanf ("%s", str) 进行读取。 %s 格式说明符只会读取遇到的第一个 whitespace 之前的字符。如果您输入由 space 分隔的 3 整数,您将永远不会读取第一个整数到 str。这使得无法从 str 中解析包含不超过 1.

sscanf 的 3 整数值

要更正此问题,请直接使用 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。这将避免新 C 程序员经常掉入的使用 scanf 获取用户输入的许多陷阱。 从不,从不,从不 使用 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;
}

例子Use/Output

(两者相同)

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

检查一下,如果您还有其他问题,请告诉我。