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

时间:2014-12-29 23:31:28

标签: c++ linux gdb printf

这可能是简单或蹩脚的问题。我一直在使用C ++中的printf函数。当我在Debian Wheezy上使用任何9个字符参数执行以下代码时(例如:“argument1”);

#include<stdio.h>

int main(int argc, char** argv){

    printf(argv[1]+'\n');

}

输出是;

SSH_AGENT_PID=4375

然后我检查了环境变量$SSH_AGENT_PID,其值为4375。

您能告诉我我的代码是怎么回事吗? (我试着检查gdb中的反汇编代码。但是我的汇编知识很难理解到底发生了什么)

3 个答案:

答案 0 :(得分:4)

简单修复:

printf("%s\n", argv[1]);

这是对代码的改进,原因有二:首先,将printf的第一个参数作为字符串常量通常是一个好主意,因为这会阻止printf代码注入。其次,它修复了这个错误,因为正如@Captain Oblivious所指出的那样,你编写的代码并没有做你认为它做的事情。

答案 1 :(得分:4)

char*字符串和字符串文字和字符文字不能一起添加。您需要创建一个新字符串并使用strcat将一个字符串连接到另一个字符串。

您实际获得的是未定义的行为,因为您正在向指针添加一些常量而不检查您是否已经通过了字符串的结尾。输出完全可读并且您的程序没有崩溃只是巧合。

如果C ++是一个选项,您可以改为使用std::string 允许+连接两个字符串。

答案 2 :(得分:2)

argv[1] + '\n'解释您所看到的内容。这是指针加上整数(字符常量在C中具有类型int

C中的定义是指针按整数中的单位前进。 ASCII中的\n10,因此这将使指针前进10个字符。如果你的字符串短于10,那么你现在正在读取超出该字符串末尾的内存中的任何内容。

Ben Braun建议的解决方案很好;另一个选项是puts( argv[1] );,它将输出字符串而不进行任何类似printf的翻译,并输出换行符。