C - 在 sscanf() 中使用空格

问题描述 投票:0回答:2

我正在尝试解析格式为

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");
  }
}
c scanf ansi-c
2个回答
4
投票

在您的代码中,您创建的主要障碍是尝试使用

scanf ("%s", str)
进行读取。
%s
格式说明符只会读取遇到的第一个空格之前的字符。如果输入由空格分隔的 3 个整数,则读入
str
的次数永远不会超过第一个。这使得无法从
sscanf
中解析带有
str
的 3 整数值,它可以包含不超过 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;
}

或者,处理 line-oriented 输入的首选方法是使用 line-oriented 输入函数

fgets
或 POSIX
getline
。这将避免新 C 程序员经常掉入的使用
scanf
获取用户输入的许多陷阱。 从不,从不,从不使用
gets
,它是如此不安全,已从C11库中删除。

使用

fgets
sscanf
的等效示例是:

#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;
}

示例使用/输出

(两者都一样)

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

仔细查看,如果您还有其他问题,请告诉我。


0
投票

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

尝试使用

gets(str)
代替。

© www.soinside.com 2019 - 2024. All rights reserved.