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');
}