Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C strtok()作为printf()中的参数反向打印值_C_String_Printf_Strtok - Fatal编程技术网

C strtok()作为printf()中的参数反向打印值

C strtok()作为printf()中的参数反向打印值,c,string,printf,strtok,C,String,Printf,Strtok,如果你有一个字符串如下 str=插入111,名称,123456789 当您将其传递给strtok并尝试打印这些值时,它们将以相反的方式输出。 例如: char* token=strtok(str," "); printf("%s %s %s %s\n",token,strtok(NULL,","),strtok(NULL,","),strtok(NULL,",")); output: insert 1234567 name 1111 代替:插入111名称123456789 为什么会这样?如何解

如果你有一个字符串如下 str=插入111,名称,123456789 当您将其传递给strtok并尝试打印这些值时,它们将以相反的方式输出。 例如:

char* token=strtok(str," ");
printf("%s %s %s %s\n",token,strtok(NULL,","),strtok(NULL,","),strtok(NULL,","));
output: insert 1234567 name 1111
代替:插入111名称123456789
为什么会这样?如何解决这一问题?

参数按调用约定顺序推送到堆栈中,在您的情况下,反过来。。。因此,参数5首先计算并推入堆栈,然后是4,3,2和格式字符串

正如之前很多评论所说,你的通话方式非常令人沮丧,
应避免使用。

未定义参数求值顺序。不要使用带有副作用的代码,如在参数中调用strtok。可能由于序列点错误,您正在经历一个未确定顺序的结果,因为无法保证参数求值的顺序。C11标准章节。6.5.2.2 10如何固定?使用惯用的whiletoken!=空循环。您的版本也很糟糕,因为如果对strtok的调用之一返回NULL,您就不应该再次调用它。永远不要依赖你认为应该是的输入数据。。。。您将为%s格式传递NULL。对于通过寄存器传递的x86_64参数,这是如何实现的?您应该区分整型参数和所有其他参数