无法在结构中输出字符

can't output char in Struct

本文关键字:输出 字符 结构      更新时间:2023-10-16
#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[6]

这将复制索引 6 处的字符。这在数组上是越界的。因此是未定义的行为。同样的 bug 还可能导致您打印未以 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++ 中的一个可爱的类型。