排序后为什么要将@@@@ P`添加到char数组中

时间:2016-10-31 22:38:15

标签: c++

我正在使用fstream从input.txt读取未排序的字符,将它们添加到[],排序[]然后将[]放入output.txt。由于某种原因,它总是在输出的开头添加像@@@@ P`这样的随机字符。这是为什么? 这是代码。

#include <fstream>
#include <iostream>
using namespace std;


int main(){
ifstream infile("input.txt");
    if(!infile){
        cout << "I cannot open the infile!\n";
        return 1;
    }
char a[100];
int c,d;
infile >> a >> c >> d;
int i,j,temp;
int l = sizeof(a)/sizeof(a[0]);
for(i = 0; i < l; i++){
    for(j = 0; j < l-1; j++){
            if(a[j+1] < a[j]){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
    }

for(int p = 0;p < l; p++){
   cout << a[p];
}
infile.close();

ofstream outfile("output.txt");

if(!outfile){
    cout << "I cannot open the outfile\n!";
    return 1;
}

for(int p = 0;p < l; p++){
   outfile << a[p];
}
infile.close();
return 0;
}

和input.txt

flohjenwxhas

2 个答案:

答案 0 :(得分:0)

infile >> a >> c >> d;

需要一个char数组和2个以空格分隔的整数。

flohjenwxhas

不包含空格,因此char数组会吞噬所有内容并且未经测试的流读取失败,不会为cd留下任何内容。这意味着使用cd而不在程序中稍后设置。这是Undefined Behaviour。 Crom只知道使用它们后会产生什么样的疯狂smurf。

int l = sizeof(a) / sizeof(a[0]);

计算数组a中的元素数。这不仅是多余的,它总是100,它远远超过“flohjenwxhas”中的字符数。这可以让你在a的未初始化部分中对谁知道什么进行排序和交换。

您可能打算使用

int l = strlen(a);

但更好的方法是让a成为std::string并使用a.size()

答案 1 :(得分:0)

您的输入长度为12个字符,因此:

cin >> a

只会填充a的前13个字符 - 输入中的12个字符和1个空字节。阵列的其余部分未初始化。

l = sizeof(a)/sizeof(a[0]);

l设置为100,然后对数组的所有100个元素进行排序,而不仅仅是12个输入字符。 @@@@P只是碰巧在未初始化字符串中的一些垃圾字符。

将其更改为:

l = strlen(a);

您需要#include <cstring>才能获得此功能。