作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试解析 UnicodeData.txt使用此格式:ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html但是,我遇到了一个问题,当我尝试阅读时,说出如下一行。
something;123D;;LINE TABULATION;
我尝试通过如下代码从字段中获取数据。问题是 fields[3] 没有被填充,scanf 返回 2。in
是当前行。
char fields[4][256];
sscanf(in, "%[^;];%[^;];%[^;];%[^;];%[^;];",
fields[0], fields[1], fields[2], fields[3]);
我知道这是 scanf()
的正确实现,但是除了我自己的 scanf()
之外,有没有办法让它工作?
最佳答案
scanf
不处理“空”字段。所以你必须自己解析它。
解决方案如下:
strchr
而不是相当慢的 sscanf
parse
函数从输入的 str
中提取字段,以分号分隔。四个分号给出五个字段,其中一些或全部可以为空。没有规定转义分号。
#include <stdio.h>
#include <string.h>
static int parse(char *str, char *out[], int max_num) {
int num = 0;
out[num++] = str;
while (num < max_num && str && (str = strchr(str, ';'))) {
*str = 0; // nul-terminate previous field
out[num++] = ++str; // save start of next field
}
return num;
}
int main(void) {
char test[] = "something;123D;;LINE TABULATION;";
char *field[99];
int num = parse(test, field, 99);
int i;
for (i = 0; i < num; i++)
printf("[%s]", field[i]);
printf("\n");
return 0;
}
这个测试程序的输出是:
[something][123D][][LINE TABULATION][]
更新:一个稍微短一点的版本,不需要额外的数组来存储每个子字符串的开头,是:
#include <stdio.h>
#include <string.h>
static int replaceSemicolonsWithNuls(char *p) {
int num = 0;
while ((p = strchr(p, ';'))) {
*p++ = 0;
num++;
}
return num;
}
int main(void) {
char test[] = "something;123D;;LINE TABULATION;";
int num = replaceSemicolonsWithNuls(test);
int i;
char *p = test;
for (i = 0; i < num; i++, p += strlen(p) + 1)
printf("[%s]", p);
printf("\n");
return 0;
}
关于c - 如何让 scanf 继续使用空扫描集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22974628/
我是一名优秀的程序员,十分优秀!