我有一个简单的程序使用sscanf.我遇到的问题是匹配后%[^-]s,sscanf似乎只是停止匹配.
这是一个简单的代码,看看我的意思.之后的%s比赛%[^-]s %s完全被忽略了.
注意:我需要它,%[^-]s因为我需要我的程序来匹配两个可能的字符串.
注2:我知道代码完全不安全等等.这只是一个例子!
#include <stdio.h>
int main(void) {
int matches;
int num1, num2, num3, num4;
char *s1[10];
char *s2[10];
char *s3[40];
char *s4[50];
char *s5[50];
char *s6[50];
char *s7[50];
char fileTest[] = "29 0 8:4 / / rw,relatime shared:1 - ext4 /dev/sda4 rw,errors=remount-ro";
// char fileTest[] = "160 48 179:56 /inte /var/oil/gaol/org.something.org/media/internal ro,nosuid,relatime - ext4 /dev/mmccc rw,data=ordered";
matches = sscanf(fileTest, "%d %d %d:%d %s %s %[^-]s %s",
&num1, &num2, &num3, &num4, s1, s2, s3, s4);
printf("matches: %d\n", matches);
printf("num1: %d\n", num1);
printf("num2: %d\n", num2);
printf("num3: %d\n", num3);
printf("num4: %d\n", num4);
printf("s1: %s\n", s1);
printf("s2: %s\n", s2);
printf("s3: %s\n", s3);
printf("s4: %s\n", s4);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是,s在后%[…]扫描集文字s,而不是扫描集的一部分.在上下文中,%[^-]s永远不会匹配s,因此任何后续转换都会失败.该%[^-]部分吞噬了任何不是破折号的东西-(并且s不是a -,因此它会被空格和其他所有东西一起变得更加紧张),然后s是不匹配的(因为转换在-字符串的一端或一端停止),所以扫描在那里失败,决赛%s永远不会匹配.
请参阅POSIX规范sscanf().阅读.重读它.重新阅读它.重新重读它.今天!明天一样.您可以在一周的剩余时间内每天缩放两次,然后每天一次缩放一周,一周一次,一个月,然后每年一次,一年中的其余时间,此后每年至少一次.该scanf()系列函数可能是最困难的标准C函数使用得很好.
您的代码还有其他主要问题.特别是,char *s1[10];应该char s1[10];和其他阵列类似.或者你需要经历主要的练习,为数组分配空间指向等等.而且,正如你可能知道的那样,%s(和%[^-])转换并不限制输入.使用%9s或%49[^-]等,以适当的尺寸.另请参见如何防止scanf()在C中导致缓冲区溢出?
格式说明符%[^-]匹配所有内容,直到-遇到a; 所以在匹配之后,缓冲区中要检查格式字符串的下一个字符是a -(如果有的话).但是如果你让这个模式跟随a s,%[^-]s那么就没有任何东西会匹配了,因为它-永远不会匹配s格式字符串中的必需元素.