我的程序在不同的机器上提供不同的输出..!

时间:2013-12-16 14:18:13

标签: c++ c string concatenation

#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”和输入字符串之间的菱形符号......!

3 个答案:

答案 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。然后再次尝试填充一个超级小缓冲区,该缓冲区应该已经满了一个额外的字符串。

此代码看起来是对缓冲区溢出攻击的邀请。