gpt4 book ai didi

c - sscanf 在 %[^-]s 匹配后缺少一个字符串

转载 作者:行者123 更新时间:2023-12-04 10:26:52 29 4
gpt4 key购买 nike

我有一个使用 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;
}

最佳答案

请注意 s%[…]之后扫描集是文字 s , 不是扫描集的一部分。在上下文中,%[^-]s永远不会匹配 s ,因此任何后续转换都会失败。 %[^-]部分吞噬任何不是破折号的东西- (并且 s 不是 - ,所以它会被压缩,连同空格和其他所有内容),然后是 s不匹配(因为转换在 - 或字符串末尾停止),因此扫描在那里失败,最后的 %s永远不会匹配。

参见 sscanf() 的 POSIX 规范.阅读。重读它。重读一遍。重新重新阅读它。今天!明天也一样。您可以在一周的剩余时间内缩减为每天两次,然后再一周每天一次,一个月一次每周一次,然后一年中剩余时间每月一次,此后至少每年一次. scanf()函数族可能是最难真正用好的标准 C 函数。

您的代码还有其他主要问题。特别是,char *s1[10];应该是 char s1[10]; , 和其他阵列类似。或者您需要完成为数组分配空间以指向等方面的主要练习。而且,您可能已经知道,%s (和 %[^-] )转换不限制输入。使用 %9s%49[^-]等,以获得合适的尺寸。另见 How to prevent scanf() causing a buffer overflow in C?

关于c - sscanf 在 %[^-]s 匹配后缺少一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54611650/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com