printf 在C++带有换行符的奇怪行为

Weird behavior of printf in C++ with a newline character

本文关键字:换行符 C++ printf      更新时间:2023-10-16

这可能是简单或蹩脚的问题。我一直在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 的翻译,并输出换行符。