[英]C scanf() scansets to read comma separated value (string and integer) from console
我有以下任务:
读取以下格式的逗号分隔数据:
string1, string2, integer_number
例如:Hi, Hello, 123 John, Doe, 45
我编写了以下代码来处理这种情况。 问题是我必须区分以下情况:
asd, asd, asd
asd, asf
scanf
返回值2
这是正确的行为,因为据我了解,首先没有给出 integer,其次没有第三个值。 所以,我需要一些帮助,如何将扫描集设置为仅在包含一些文本和逗号 - >“文本”时作为正确的字符串数据传递。 或者也许我应该使用与scanf()
不同的 function 。使这项任务更难的是要求不使用由 [] 声明或动态分配的任何其他 arrays。 这必须仅使用这 3 个变量来完成。 不允许使用其他缓冲区。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char string1[20];
char string2[20];
int number;
printf("Type data:\n");
int ret_val = scanf("%[a-zA-Z], %[a-zA-Z], %d", string1, string2, &number);
if (ret_val != 3) {
printf("ret_val %d", ret_val);
return 1;
}
printf("%s %s %d\n", string1, string2, number);
return 0;
}
我通常使用*scanf()
依赖的技巧是使用%n
来检测输入是否被读取到这一点; 当您期望一些文字时,这特别有用(在*scanf()
的结果中不考虑它们)。
请注意,根据man 3 sscanf
, *scanf()
的结果中不考虑%n
。
/**
gcc -std=c99 -o prog_c prog_c.c \
-pedantic -Wall -Wextra -Wconversion \
-Wc++-compat -Wwrite-strings -Wold-style-definition -Wvla \
-g -O0 -UNDEBUG -fsanitize=address,undefined
**/
#include <stdio.h>
void
parse_line(const char *line)
{
printf("[%s] --> ", line);
char string1[20]="";
char string2[20]="";
int number=-1;
int n1=-1, n2=-1;
int r=sscanf(line, "%[a-zA-Z],%n %[a-zA-Z],%n %d",
string1, &n1, string2, &n2, &number);
switch(r)
{
case 3:
{
printf("3 fields extracted: %s %s %d\n", string1, string2, number);
break;
}
case 2:
{
if(n2!=-1) // this coma has been read
{
printf("incorrect third field, ");
}
printf("2 fields extracted: %s %s\n", string1, string2);
break;
}
case 1:
{
if(n1!=-1) // this coma has been read
{
printf("incorrect second field, ");
}
printf("1 field extracted: %s\n", string1);
break;
}
default:
{
printf("no field extracted\n");
}
}
}
int
main(void)
{
parse_line("Hi, Hello, 123");
parse_line("John, Doe, 45");
parse_line("asd, asd, asd");
parse_line("asd, asf");
parse_line("asd, ");
parse_line("asd");
parse_line("");
return 0;
}
/**
[Hi, Hello, 123] --> 3 fields extracted: Hi Hello 123
[John, Doe, 45] --> 3 fields extracted: John Doe 45
[asd, asd, asd] --> incorrect third field, 2 fields extracted: asd asd
[asd, asf] --> 2 fields extracted: asd asf
[asd, ] --> incorrect second field, 1 field extracted: asd
[asd] --> 1 field extracted: asd
[] --> no field extracted
**/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.