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()
来标记输入,然后根据第一个标记值,根据需要迭代输入字符串。
通用算法看起来像
使用fgets()
读取整行
使用 strtok()
进行分词,使用 space (
) 作为分隔符。
取第一个标记,将其与所需的输入选项 c
或 d
进行比较。
注意:不要混淆字符 'c'
、'd'
和 string "c"
、"d"
基于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);
我需要从一条线上获得一次不同的输入。特别是我需要得到一个 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()
来标记输入,然后根据第一个标记值,根据需要迭代输入字符串。
通用算法看起来像
使用
读取整行fgets()
使用
strtok()
进行分词,使用 space (取第一个标记,将其与所需的输入选项
c
或d
进行比较。注意:不要混淆字符
'c'
、'd'
和 string"c"
、"d"
基于token值,可以在同一个字符串上增加对
strtok()
的调用,获取输入中剩余数据的值,可以利用已有的switch-case
方法。一般来说,一直持续到strtok()
returns NULL.
也就是说,回答你的问题,
it works fine for the
d
case but goes in segfault in thec
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);