我需要从一行中获得一次不同的输入。特别是我需要获得一个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
情况下进行了段错误。我该怎么办?
答案 0 :(得分:3)
我并不是说使用scanf()
无法完成,但恕我直言,这不是最好的方法。相反,使用fgets()
来读取整体,使用strtok()
来标记输入,然后根据第一个标记值,根据需要迭代输入字符串。
通用算法看起来像
fgets()
)作为分隔符使用strtok()
进行标记。获取第一个令牌,将其与您所需的输入选项c
或d
进行比较。
注意:不要混淆角色'c'
,'d'
和字符串 "c"
,"d"
strtok()
的更多调用以获取输入中剩余数据的值,您可以使用现有的switch-case
方法。通常,继续直到strtok()
返回NULL。 那就是说,回答你的问题,
它适用于
d
案例,但在c
案例中以段错误方式进行。
原因是,在当前程序中,您的代码会调用undefined behaviour,因为您正在使用未初始化的指针alpha
和beta
。您需要在使用之前为它们分配内存,可能通过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
即可。