2401_83264931 2024-05-20 20:14 采纳率: 54.2%
浏览 0
已结题

这是个什么错误啊,没见过啊

img


这是个什么错误
从来没有见到过啊
求解惑
我感觉交换的没问题吧,TAT

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-20 20:14
    关注

    引自免费微信小程序:皆我百晓生

    这个错误不是因为代码逻辑有问题,而是关于代码安全性的警告。在C++编程中,标准库函数strcpy()strcmp()被标记为不安全(unsafe),因为它们没有内置边界检查,可能导致缓冲区溢出的安全问题。为了避免这种情况,Microsoft Visual C++编译器推荐使用更安全的版本:strcpy_s()strcmp_s()

    为了消除这些警告,你需要将所有strcpy()函数替换为strcpy_s(),并确保提供足够的空间来存储字符串。同时,你也需要处理strcmp()函数的类似情况。这里是一个修改后的代码示例:

    #include <iostream>
    #include <string.h> // 添加此行以包含strcpy_s和strcmp_s
    
    using namespace std;
    
    void swap(char* x, char* y, size_t size_x, size_t size_y) {
        char temp[size_x + 1]; // 确保有足够的空间
        strcpy_s(temp, size_x + 1, x); // 使用strcpy_s替代
        strcpy_s(x, size_x + 1, y);
        strcpy_s(y, size_y + 1, temp);
    }
    
    int main() {
        char str1[99], str2[99], str3[99];
        cout << "请输入三个单词" << endl;
        cin >> str1 >> str2 >> str3;
        
        if(strcmp(str1, str2) > 0) {
            swap(str1, str2, sizeof(str1), sizeof(str2));
        }
        if(strcmp(str1, str3) > 0) {
            swap(str1, str3, sizeof(str1), sizeof(str3));
        }
        if(strcmp(str2, str3) > 0) {
            swap(str2, str3, sizeof(str2), sizeof(str3));
        }
    
        cout << str1 << " " << str2 << " " << str3 << endl;
        return 0;
    }
    

    这段代码做了以下改动:

    1. 包含了 <string.h> 头文件,其中包含了strcpy_sstrcmp_s 函数。
    2. 定义了一个新的swap函数,它接受两个额外的参数size_xsize_y,用于传递每个字符串的长度。这样可以确保不会发生缓冲区溢出。
    3. 在调用swap函数时,传入了字符串的大小。
    4. strcmp()函数保留不变,因为在Visual Studio中,strcmp()通常被认为是相对安全的,因为它不会导致缓冲区溢出。

    尽管上述代码消除了警告,但为了完全遵循建议,你也可以考虑使用std::string替代字符数组,这会更方便且安全。如果你选择这样做,代码将会变成:

    #include <iostream>
    #include <algorithm>
    #include <string>
    
    using namespace std;
    
    int main() {
        string str1, str2, str3;
        cout << "请输入三个单词" << endl;
        getline(cin, str1);
        getline(cin, str2);
        getline(cin, str3);
    
        sort({str1, str2, str3}.begin(), str1.end()); // 使用sort排序
    
        cout << str1 << " " << str2 << " " << str3 << endl;
        return 0;
    }
    

    在这个版本中,我们使用了std::string类型,并利用了std::sort函数对字符串进行排序,简化了代码并提高了安全性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月20日
  • 已采纳回答 5月20日
  • 创建了问题 5月20日