读取 sscanf() 中的可选空格
Reading optional white spaces in sscanf()
所以我一直在做一个 C 项目,但我一直被这个问题所困扰,基本上我正在制作一个程序,用户可以在其中输入他们的名字,然后我将它打印到一个文件中,包括用户的名字和姓氏user 用逗号分隔,但是,允许在逗号周围使用可选的空格。这就是我一直在使用的读取用户名:
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
将验证用户是否恰好键入了 2 个由逗号和可选空格分隔的字母组成的单词,后跟换行符。
但我强烈建议您自己解析输入,而不是依赖 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 = '[=11=]';
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 = '[=11=]';
while (isspace((unsigned char)*p)) p++;
if (*lastName && *firstName && !*p) {
// format is OK
printf("Hello %s %s\n", 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, ", \t\r\n");
if (last)
first = strtok (NULL, ", \t\r\n");
if (last && first) {
sprintf(firstName, "%.19s", first);
sprintf(lastName, "%.19s", last);
printf ("%s %s\n", firstName, lastName);
}
return 0;
}
所以我一直在做一个 C 项目,但我一直被这个问题所困扰,基本上我正在制作一个程序,用户可以在其中输入他们的名字,然后我将它打印到一个文件中,包括用户的名字和姓氏user 用逗号分隔,但是,允许在逗号周围使用可选的空格。这就是我一直在使用的读取用户名:
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
将验证用户是否恰好键入了 2 个由逗号和可选空格分隔的字母组成的单词,后跟换行符。
但我强烈建议您自己解析输入,而不是依赖 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 = '[=11=]';
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 = '[=11=]';
while (isspace((unsigned char)*p)) p++;
if (*lastName && *firstName && !*p) {
// format is OK
printf("Hello %s %s\n", 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, ", \t\r\n");
if (last)
first = strtok (NULL, ", \t\r\n");
if (last && first) {
sprintf(firstName, "%.19s", first);
sprintf(lastName, "%.19s", last);
printf ("%s %s\n", firstName, lastName);
}
return 0;
}