c - 读取 sscanf() 中的可选空格

  • 本文关键字:空格 读取 sscanf ansi-c
  • 更新时间 :
  • 英文 :


所以我一直在做一个 C 项目,我坚持这个问题,基本上我制作了一个程序,用户可以在其中输入他们的名字,后来我把它打印到一个文件中,用户的名字和姓氏用逗号分开,但是,逗号周围允许可选的空格。这是我一直在使用的读取用户名:

    char lastName[20]; 
    char firstName[20]; 
    char line[LINESIZE]; 
    while(fgets(line,LINESIZE,stdin)) { 
       if((sscanf(line," %s , %s ",lastName,firstName)) == 2)  { 
             /*process name */
       } 
    }

但是,它唯一成功读取输入的时间是用户输入时:

john , doe 

它与我拥有的 %s 、%s 匹配,我怎样才能让它像这样:

john, doe 
john ,doe 

都能工作吗?

我也试过

sscanf(line,"%s%[],%[]%s"); 

这不会导致编译错误,但它不处理输入,这意味着它与 %s 、%s 不匹配

您可以修改sscanf格式以使其执行更严格的测试:

char eol[2];
if (sscanf(line, " %19[a-zA-Z-] , %19[a-zA-Z-]%1[n]", lastName, firstName, eol) == 3) ...

sscanf将验证用户键入的单词是否恰好由逗号和可选空格分隔的字母组成,后跟换行符。

但我强烈建议您自己解析输入,而不是依赖sscanf。 这并不困难,更精确和灵活,并且更不容易出错:

char lastName[LINESIZE];
char firstName[LINESIZE]; 
char line[LINESIZE]; 
while(fgets(line,LINESIZE,stdin)) {
   char *p = line, *q;
   while (isspace((unsigned char)*p)) p++;
   for (q = lastName; isalpha((unsigned char)*p); p++) {
       *q++ = *p;
   }
   *q = '';
   while (isspace((unsigned char)*p)) p++;
   if (*p == ',') p++;
   while (isspace((unsigned char)*p)) p++;
   for (q = firstName; isalpha((unsigned char)*p); p++) {
       *q++ = *p;
   }
   *q = '';
   while (isspace((unsigned char)*p)) p++;
   if (*lastName && *firstName && !*p) {
       // format is OK
       printf("Hello %s %sn", firstName, lastName);
   } 
}

这将隔离名称,以便"Doe , John"的任何排列都过滤掉空格

#include <stdio.h>
#include <string.h>
#define LINESIZE 100
int main(void) {
    char lastName[20] = {0}; 
    char firstName[20] = {0}; 
    char line[LINESIZE]; 
    char *first = NULL, *last = NULL;
    if (NULL == fgets(line,LINESIZE,stdin))
        return 1;
    last = strtok (line, ", trn");
    if (last)
        first = strtok (NULL, ", trn");
    if (last && first) {
        sprintf(firstName, "%.19s", first);
        sprintf(lastName, "%.19s", last);
        printf ("%s %sn", firstName, lastName);
    }
    return 0;
}

最新更新