scanf 一次获取多个值

scanf get multiple values at once

我需要从一条线上获得一次不同的输入。特别是我需要得到一个 char 然后,根据我刚刚读取的 char 值,它可以是一个字符串和一个 int 或一个字符串,一个 int 和另一个字符串等等。

示例输入可能是:

c test 20 good
d test 10

这是我写的:

char c, * alpha, * beta;
int val;
c = getchar();
printf("%c\n\n", c);

switch (c){
    case 'd': scanf("%s %d", alpha, &val); printf ("%c %s %d", c, alpha, val); break;
    case 'c': scanf("%s %d %s", alpha, &val, beta);  printf ("%c %s %d %s", c, alpha, val, beta); break;
    default: return 0;
}

除了它需要一个换行符(即我按 return)来获取第一个字符外,它在 d 情况下工作正常,但在 c 情况下会出现段错误。我应该怎么做?

我并不是说不能使用 scanf() 来完成,但是恕我直言,这不是最好的方法。相反,使用 fgets() 来读取整个 like,使用 strtok() 来标记输入,然后根据第一个标记值,根据需要迭代输入字符串。

通用算法看起来像

  1. 使用fgets()

    读取整行
  2. 使用 strtok() 进行分词,使用 space ( ) 作为分隔符。

  3. 取第一个标记,将其与所需的输入选项 cd 进行比较。

    注意:不要混淆字符 'c''d'string "c""d"

  4. 基于token值,可以在同一个字符串上增加对strtok()的调用,获取输入中剩余数据的值,可以利用已有的switch-case 方法。一般来说,一直持续到 strtok() returns NULL.

也就是说,回答你的问题,

it works fine for the d case but goes in segfault in the c case.

原因是,在当前程序中,您的代码调用了 undefined behaviour, as you're using uninitialized pointers alpha and beta. You need to allocate memory to them before using, maybe through malloc() 和 family.

你可以使用单个scanf,但你需要根据第一个字符读取后解析输入。

char c, alpha[20], tmp[20];
scanf("%c %s %[^\n]\n", &c, alpha, tmp);

//Here 20 is taken for example, size can be anything

然后您可以检查 c 的值。如果 c=='c' 那么,您需要将 tmp 分成两部分,第一部分是整数,您可以通过 atoi() 函数将其存储在 val 中,另一部分是字符串。

如果c=='d'那么,你只需要将tmp复制到beta就可以了。

char c, alpha[8], beta[8];
int val;
char line[32];
int state;

fgets(line, sizeof line, stdin);//input by one line
state = sscanf(line, " %c %7s %d %7s", &c, alpha, &val, beta);
if(c == 'd' && state == 3)
    printf ("%c %s %d", c, alpha, val);
else if(c == 'c' && state == 4)
    printf ("%c %s %d %s", c, alpha, val, beta);