Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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 printf()-打印错误的顺序。单独打印时有效_C_Printf - Fatal编程技术网

C printf()-打印错误的顺序。单独打印时有效

C printf()-打印错误的顺序。单独打印时有效,c,printf,C,Printf,我正在尝试以通用日志格式打印一些文本 printf("%s - - [%s] %s %d %zu\n", ip, _time, row, statuscode, size); 问题是订单被搞混了。输出为: 200 1511 - - [20/Sep/2017:13:07:32 +0200] GET / HTTP/1.1 我认为(1511)是ip被打印出来的。不知道为什么 当我这样打印它们时: printf("1. %s\n", ip); printf("2. %s\n", _time); pr

我正在尝试以通用日志格式打印一些文本

printf("%s - - [%s] %s %d %zu\n", ip, _time, row, statuscode, size);
问题是订单被搞混了。输出为:

200 1511 - - [20/Sep/2017:13:07:32 +0200] GET / HTTP/1.1
认为
1511
)是
ip
被打印出来的。不知道为什么

当我这样打印它们时:

printf("1. %s\n", ip);
printf("2. %s\n", _time);
printf("3. %s\n", row);
printf("4. %d\n", statuscode);
printf("5. %zu\n", size);
它的工作原理与预期相同:

1. 127.0.0.1
2. 20/Sep/2017:13:11:24 +0200
3. GET / HTTP/1.1
4. 200
5. 151
由于某种原因,当我添加
statuscode
时,问题似乎就开始了。我不知道为什么。感谢您的帮助

下面是我使用prinft()的函数:

正如有人所说,ip变量可能有问题:

static char* getip(struct sockaddr_storage client_addr) {
    char ipstr[20];
    struct sockaddr_in *s;


    s = (struct sockaddr_in *) &client_addr;

    /**
     * Converts network address (s) in the IPV_4 family into a string.
     */
    return strdup(inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr));
 }

我认为问题来自包含
\r
字符的

只需使用
strchr(…)


您确定数据类型匹配吗?否则,您将有未定义的行为。请发布寻求调试帮助的问题(为什么此代码不起作用?)必须包括所需的行为、特定的问题或错误以及在问题本身中复制它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建。在您的示例中,“ip”变量指向存储字符串“200 151…”的其他位置,这与尚未完全解析的状态代码和长度惊人地相似。仔细检查其指向的位置及其空终止。(最初的“八进制转储”,IIRC)在这里是一个有用的工具,如果您运行在POSIX或类似POSIX的系统上。不要运行
myprogram
,而是运行
myprogram | od-c
查看打印的每个字符,包括
\r
回车等控制字符。当我使用该命令时,程序不会打印任何内容。我还需要做什么吗?我想你确实是对的,但是我会将“\r”改为“\n”我想这是预期用途?
static char* getip(struct sockaddr_storage client_addr) {
    char ipstr[20];
    struct sockaddr_in *s;


    s = (struct sockaddr_in *) &client_addr;

    /**
     * Converts network address (s) in the IPV_4 family into a string.
     */
    return strdup(inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr));
 }
/* replace all '\r' by 'R' in row */
char *p = strchr(row, '\r');
while(p)
{ 
    *p = 'R';
    p = strchr(row, '\r');
}