#include<iostream>
#include<string.h>
#include<stdio.h>
int main()
{
char left[4];
for(int i=0; i<4; i++)
{
left[i]='0';
}
char str[10];
gets(str);
strcat(left,str);
puts(left);
return 0;
}
对于任何输入,它应该将0000与该字符串连接,但在一台电脑上它显示“0000”和输入字符串之间的菱形符号......!
答案 0 :(得分:2)
代码中存在两个问题。
首先,left
不是以空值终止的,因此strcat
最终会在数组末尾之外查找附加字符的适当位置。将'\0'
放在数组的末尾。
其次,left
不足以保存对strcat
的调用结果。结果字符串必须有足够的空间,包括nul终止符。所以left
的大小应该至少为4 + 9,以允许left
开始使用的三个字符(加上nul终止符),以及来自str
的9个字符(假设gets
没有造成溢出。)
这些错误中的每一个都会导致未定义的行为,这会导致不同平台上的不同结果。
答案 1 :(得分:1)
我不知道你为什么还要包含<iostream>
,因为你没有在代码中使用任何C ++功能。如果您有以下内容,整个计划将会缩短:
#include <iostream>
#include <string>
int main()
{
std::string line;
std::cin >> line;
std::cout << "You entered: " << line;
return 0;
}
由于std::string
将以空终止,因此没有理由强制它以4-null终止。
答案 2 :(得分:0)
问题#1 - 不是合法的字符串:
char left[4];
for(int i=0; i<4; i++)
{
left[i]='0';
}
字符串必须以零个字符结尾,'\0'
不是'0'
。
这会导致你描述的内容。
问题#2 - fgets
。你在一个小缓冲区上使用它。非常危险。
问题#3 - strcat
。然后再次尝试填充一个超级小缓冲区,该缓冲区应该已经满了一个额外的字符串。
此代码看起来是对缓冲区溢出攻击的邀请。