printf 在C++带有换行符的奇怪行为
Weird behavior of printf in C++ with a newline character
这可能是简单或蹩脚的问题。我一直在C++玩printf
函数。当我使用任何 9 个字符的参数(例如:"argument1")在 Debian Wheezy 上执行以下代码时;
#include<stdio.h>
int main(int argc, char** argv){
printf(argv[1]+'n');
}
输出是;
SSH_AGENT_PID=4375
然后我检查了环境变量$SSH_AGENT_PID
,其值为 4375。
你能告诉我我的代码是怎么回事吗?(我试图在 gdb 中检查反汇编的代码。但是我的组装知识很差,无法确切地理解发生了什么)
简单的修复:
printf("%sn", argv[1]);
这是对代码的改进,原因有两个:首先,通常最好将 printf 的第一个参数设置为字符串常量,因为这会阻止 printf 代码注入。其次,它修复了错误,因为正如@Captain Oblivious指出的那样,你编写的代码并没有做你认为它做的事情。
char*
字符串和字符串文本以及字符文本不能添加在一起。您需要创建一个新字符串并使用strcat
将一个字符串连接到另一个字符串。
实际得到的是未定义的行为,因为您正在向指针添加一些常量,而不是检查是否已传递字符串的末尾。输出完全可读并且您的程序没有崩溃只是巧合。
如果C++是一个选项,则可以改用std::string
,这确实允许+
连接两个字符串。
解释你从argv[1] + 'n'
中看到的内容。这是指针加整数(字符常量在 C 中具有类型 int
)。
在 C 语言中,指针的定义是指针前进的单位与整数中的单位一样多。 n
以 ASCII 格式10
,因此这会将指针前进 10 个字符。如果您的字符串短于 10,那么您现在正在读取该字符串末尾以外的内存中的任何内容。
Ben Braun 建议的修复是一个很好的修复;另一个选项是puts( argv[1] );
它将输出字符串而不进行任何类似 printf 的翻译,并输出换行符。
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 在 Stream C++ 文本之前有一个额外的换行符
- 流:CSV 文件中的换行符
- 如何在三元条件运算符中添加换行符和连接? :在 C++ 中
- Clang-格式:在多行语句之后的换行符上打开大括号
- 在输出流中插入换行符
- 防止控制台在通道字符(在 c++ 中)中输入空格(即空格、制表符和换行符)
- QProcess::readAllStandardOutput() 和换行符
- 如果有换行符,clang 格式不会附加大括号
- 提取后返回换行符的C++istream.get()
- 如何在出现换行符之前将多个整数作为输入?
- 正则表达式 获取两个换行符之间的文本
- 包含换行符分隔的单词的文件和C++中这些单词的字符串向量的大小是否相同?
- 在字符串中输入换行符
- 从文本文件中读取数据并删除所有换行符空格,并在 C++ 控制台中显示
- 使用 fgets() 从键盘读取时从以前的输入读取换行符
- C++ 换行符上的合并排序错误中断
- 在 std::string 的末尾插入换行符
- 连接两个文件时如何避免冗余尾随换行符?