[英]C different behavior of sscanf i386 vs x86_64 parsing quoted string
I have found strange behavior of sscanf
parsing double quoted string on i386 machine.我发现
sscanf
在 i386 机器上解析双引号字符串的奇怪行为。
My code:我的代码:
char string[] = "\"1597821828\" \"MODIFY\" \"/fullpath/test2\"";
printf("line : %s", string);
int total;
char store_date[12] = "", store_etat_watch[24] = "", store_path[1024] = "";
printf("stores init:%s,%d , %s,%d , %s,%d \n",
store_date, strlen(store_date),
store_etat_watch, strlen(store_etat_watch),
store_path, strlen(store_path));
total = sscanf(string,"%s %s %s", store_date, store_etat_watch, store_path);
printf("stores brut:%s,%d , %s,%d , %s,%d \n",
store_date, strlen(store_date),
store_etat_watch, strlen(store_etat_watch),
store_path, strlen(store_path));
I compile it on a debian arm64 an execute it (here is my Makefile):我在 debian arm64 上编译它并执行它(这是我的 Makefile):
CC = gcc
CC = gcc
ERROR_CFLAGS = -Wall -W -pedantic -Wextra -Werror CFLAGS = -static -g -O0 $(ERROR_FLAGS) -D_REENTRANT -DLinux LDFLAGS = $(ERROR_FLAGS)
ERROR_CFLAGS = -Wall -W -pedantic -Wextra -Werror CFLAGS = -static -g -O0 $(ERROR_FLAGS) -D_REENTRANT -DLinux LDFLAGS = $(ERROR_FLAGS)
all: sscanf_test
全部:sscanf_test
sscanf_test: sscanf_test.c $(CC) $(CFLAGS) sscanf_test.c -o sscanf_test.PHONY:clean
sscanf_test: sscanf_test.c $(CC) $(CFLAGS) sscanf_test.c -o sscanf_test.PHONY:clean
clean: rm -f sscanf_test
清洁:rm -f sscanf_test
result:结果:
line: "1597821828" "MODIFY" "/fullpath/test2"
行:“1597821828”“修改”“/fullpath/test2”
stores init:,0, ,0, ,0
存储 init:,0, ,0, ,0
stores brut:"1597821828",12, "MODIFY",8, "/fullpath/test2",17
存储 brut:"1597821828",12, "MODIFY",8, "/fullpath/test2",17
That's the result I expect.这就是我所期望的结果。 Then I compile it on ubuntu i386 and execute it:
然后我在 ubuntu i386 上编译并执行:
result:结果:
line: "1597821828" "MODIFY" "fullpath/test2"
行:“1597821828”“修改”“完整路径/test2”
stores init:,0, ,0, ,0
存储 init:,0, ,0, ,0
stores brut: "1597821828""MODIFY",20 , "MODIFY",8,"/fullpath/test2",17
商店 brut: "1597821828""MODIFY",20 , "MODIFY",8,"/fullpath/test2",17
The first string is not correctly parsed.第一个字符串未正确解析。 If the string doesn't begin with double quote: 'no problem'.
如果字符串不以双引号开头:'没问题'。
char string[]="1597821828 \"MODIFY\" \"/fullpath/test2\"";
result:结果:
line: "1597821828" "MODIFY" "/fullpath/test2"
行:“1597821828”“修改”“/fullpath/test2”
stores init:,0, ,0, ,0
存储 init:,0, ,0, ,0
stores brut:1597821828,10, "MODIFY",8, "/fullpath/test2",17
商店 brut:1597821828,10, "MODIFY",8, "/fullpath/test2",17
I do have to parse string beginning with double quote.我必须解析以双引号开头的字符串。
Somebody can help me?有人可以帮助我吗?
char store_date[12]
is too small to store the the string *1597821828*
(Quote character replaced by *
for clarity.). char store_date[12]
太小,无法存储字符串*1597821828*
(为清楚起见,引号字符替换为*
。)。 Result: undeifned behavior (UB).结果:未定义的行为(UB)。 A string of length 12 needs at least 12+1
char
.长度为 12 的字符串至少需要 12+1
char
。 The +1 is for the null character . +1 用于null 字符。
That it seemed to work on some systems is normal for UB;它似乎在某些系统上工作对于 UB 来说是正常的; UB isn't "required to fail", it's " anything can happen".
UB 不是“必须失败”,而是“任何事情都可能发生”。 If the memory you stepped on outside
store_data[12]
happened to not be something the compiler was using for anything needed later in the function, it can happen to work.如果您在
store_data[12]
之外踩到的 memory 碰巧不是编译器用于稍后在 function 中需要的任何东西,它可能会发生工作。 That's what makes undefined behaviour so nasty: testing can't always reveal it.这就是使未定义行为如此讨厌的原因:测试不能总是揭示它。
Make the destination array large enough and use widths with "%s"
.使目标数组足够大,并使用带有
"%s"
宽度。
// char store_date[12]="";
// total=sscanf(string,"%s",store_date);
char store_date[12+1]="";
total=sscanf(string,"%12s",store_date);
Mis-matched specifier with strlen()
与
strlen()
不匹配的说明符
// printf("%d \n",strlen(store_path));
printf("%zu\n",strlen(store_path));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.