scanf一次获取多个值

时间:2015-06-22 13:40:57

标签: c char scanf

我需要从一行中获得一次不同的输入。特别是我需要获得一个char,然后,根据我刚刚阅读的char值,它可以是字符串,int或字符串,{{1}和另一个字符串等等。

示例输入可能是:

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; } 情况,但在d情况下进行了段错误。我该怎么办?

3 个答案:

答案 0 :(得分:3)

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

通用算法看起来像

  1. 使用fgets()
  2. 阅读整行
  3. 使用空格()作为分隔符使用strtok()进行标记。
  4. 获取第一个令牌,将其与您所需的输入选项cd进行比较。

    注意:不要混淆角色'c''d'字符串 "c""d"

  5. 根据令牌值,您可以在同一字符串上添加对strtok()的更多调用以获取输入中剩余数据的值,您可以使用现有的switch-case方法。通常,继续直到strtok()返回NULL。
  6. 那就是说,回答你的问题,

      

    它适用于d案例,但在c案例中以段错误方式进行。

    原因是,在当前程序中,您的代码会调用undefined behaviour,因为您正在使用未初始化的指针alphabeta。您需要在使用之前为它们分配内存,可能通过malloc()和family。

答案 1 :(得分:1)

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);

答案 2 :(得分:0)

您可以使用单个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分成两部分,第一部分是整数,您可以val通过atoi()函数存储,另一部分是字符串。

然后,如果c=='d',您只需将tmp复制到beta即可。