printf中%s后续字符覆盖输出开头字符的问题咨询
printf中%s后续字符覆盖输出开头字符的问题咨询
嘿,这个问题我之前踩过坑!其实罪魁祸首就是你定义的user_agent字符串末尾的那个\r(回车符)!
你可能不知道,\r的作用是把输出光标移到当前行的开头位置,而不是换行(换行是\n)。当printf输出%s对应的user_agent时,最后那个\r会让光标瞬间跳回行首,紧接着输出的冒号:就会覆盖掉行首的第一个字符A,于是原本应该是AGENT:的开头就变成了:GENT:,剩下的内容跟着输出,就出现了你看到的奇怪结果。
给你两个解决办法:
- 如果这个
\r是你手动加的,直接删掉就行,把字符串改成char user_agent[] = "foobar/1.2.3"; - 如果
\r是从外部输入(比如网络请求、文件读取)带进来的,可以手动处理掉它,比如用字符串函数找到并替换成字符串结束符\0,示例代码如下:
#include <stdio.h> #include <string.h> int main() { char user_agent[] = "foobar/1.2.3\r"; // 获取字符串长度,检查末尾是否是\r size_t str_len = strlen(user_agent); if (str_len > 0 && user_agent[str_len - 1] == '\r') { // 把\r替换成字符串结束符,截断掉它 user_agent[str_len - 1] = '\0'; } printf("AGENT: %s:\nHELLO", user_agent); return 0; }
修改之后再运行,就能得到你预期的输出:AGENT: foobar/1.2.3: HELLO啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

