繁体   English   中英

C scanf() 扫描集以从控制台读取逗号分隔值(字符串和整数)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM