#include <iostream>
using namespace std;
struct Flight {
char flightNumber[6];
int depHour;
int depMin;
};
int main() {
char flightNumber[6];
int depHour;
int depMin;
cin.getline(flightNumber, 6);
cin >> depHour;
cin >> depMin;
Flight f = {.flightNumber = flightNumber[6], .depHour=depHour , .depMin= depMin};
cout << f.flightNumber << " " << f.depHour << " " << f.depMin << endl;
return 0;
}
无论我在 flightNumber 中输入什么,都不会显示。编译没有错误,但无法输出 flightNumber。它是空的。知道问题出在哪里吗?
最佳答案
.flightNumber = flightNumber[6]
复制索引 6 处的字符。这是数组的边界。因此是未定义的行为。同样的错误也可能导致您打印一个未以 null 终止的字符串,这也会导致未定义的行为。
您需要使用某种形式的strncpy()
话虽这么说......我很惊讶这个编译没有警告(而且它在 clang 上对我有用)。
正确的代码版本 1:
#include <iostream>
using namespace std;
struct Flight {
char flightNumber[6];
int depHour;
int depMin;
};
int main() {
char flightNumber[6];
int depHour;
int depMin;
cin.getline(flightNumber, 6);
cin >> depHour;
cin >> depMin;
Flight f = {.depHour=depHour , .depMin= depMin};
strcpy(f.flightNumber, flightNumber);
cout << f.flightNumber << " " << f.depHour << " " << f.depMin << endl;
return 0;
}
正确的代码版本 2:
#include <iostream>
using namespace std;
struct Flight {
Flight(char *flightNumber_, int depHour_, int depMin_): depHour(depHour_), depMin(depMin_) {
strcpy(flightNumber, flightNumber_);
}
char flightNumber[6];
int depHour;
int depMin;
};
int main() {
char flightNumber[6];
int depHour;
int depMin;
cin.getline(flightNumber, 6);
cin >> depHour;
cin >> depMin;
Flight f(flightNumber, depHour, depMin);
cout << f.flightNumber << " " << f.depHour << " " << f.depMin << endl;
return 0;
}
注意事项:
- 不要像我一样使用
strcpy()
。将strncpy()
与验证代码一起使用,以确保您不会复制超出分配数组的长度。 std::string
是 c++ 中一个可爱的类型。
关于c++ - 无法在 Struct 中输出 char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25597922/