我正在使用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
答案 0 :(得分:0)
infile >> a >> c >> d;
需要一个char
数组和2个以空格分隔的整数。
flohjenwxhas
不包含空格,因此char数组会吞噬所有内容并且未经测试的流读取失败,不会为c
和d
留下任何内容。这意味着使用c
和d
而不在程序中稍后设置。这是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>
才能获得此功能。