巨兔12138 发表于 2020-7-4 15:03:52

strcpy函数不安全问题

#include<iostream>
#include<string>

using namespace std;

char select(char a[], char b[], char c[]);

int main()
{
        char a;
        char b;
        char c;
        cout << "输入三个国家的英文名:";
        cin >> a >> b >> c;

        cout << "按首字母排序最靠前的国家是:" << select(a, b, c);
}
char select(char a[], char b[], char c[])
{
        char x;
        if (strcmp(a, b) > 0)
        {
                if (strcmp(b, c) > 0)
                        strcpy(x, c);
                else
                        strcpy(x, b);
        }
        else
        {
                if (strcmp(a, c) > 0)
                        strcpy(x, c);
                else
                        strcpy(x, a);
        }
        return x;
}
调试的时候编译器报错strcpy不安全,无法运行,但是课本上就是这么教的...
我用的编译器是vs2019
麻烦各位大神帮忙看下该怎么改啊

永恒的蓝色梦想 发表于 2020-7-4 15:40:17

第一行加上:#define _CRT_SECURE_NO_WARNINGS

巨兔12138 发表于 2020-7-4 15:51:51

永恒的蓝色梦想 发表于 2020-7-4 15:40
第一行加上:

你好请问为什么运行结果会出现,cout的结果是一个“?”的情况呢

superbe 发表于 2020-7-4 22:09:49

本帖最后由 superbe 于 2020-7-5 22:15 编辑

select()函数,如果本意是要返回国家的首字母,应该是return x,不是x。x下标范围是0到19,实际国家名可能还不到19,x是一个未知的字符。

如果是要返回完整的国家名,可以参考下面改法。这时不能只返回 x 的地址,因为 x 数组是局部变量,函数结束后 x 内容不存在了,main()输出就不正确。

改法一,在main里添加一个数组用来保存select()比较的结果,把这个数组做为参数传给select()
#include<iostream>
#include <cstring>
//#include<string>

using namespace std;

void select(char a[], char b[], char c[], char result[]);

int main()
{
    char a;
    char b;
    char c;
    char result;//result[]保存比较结果
    cout << "输入三个国家的英文名:";
    cin >> a >> b >> c;

    select(a, b, c, result);
    cout << "按首字母排序最靠前的国家是:" << result << endl;
}

void select(char a[], char b[], char c[], char result[])
{
    if (strcmp(a, b) > 0)
    {
      if (strcmp(b, c) > 0)
            strcpy(result, c);
      else
            strcpy(result, b);
    }
    else
    {
      if (strcmp(a, c) > 0)
            strcpy(result, c);
      else
            strcpy(result, a);
    }
}


其中select()函数也可以改成返回result[]的地址:
char * select(char a[], char b[], char c[], char result[])
{
    ......
    return result;
}
这样的好处是cout可以直接 cout << select(a, b, c, result)

superbe 发表于 2020-7-4 22:18:15

这是改法二,也就是select()比较后返回相应数组的地址,这样就不用添加result数组了。
#include<iostream>
#include <cstring>

using namespace std;

char * select(char a[], char b[], char c[]);

int main()
{
    char a;
    char b;
    char c;
    cout << "输入三个国家的英文名:";
    cin >> a >> b >> c;

    cout << "按首字母排序最靠前的国家是:" << select(a, b, c) << endl;

}

char * select(char a[], char b[], char c[])
{
    char * temp;
    if (strcmp(a, b) > 0)
    {
      if (strcmp(b, c) > 0)
            temp = c;
      else
            temp = b;
    }
    else
    {
      if (strcmp(a, c) > 0)
            temp = c;
      else
            temp = a;
    }
    return temp;
}
页: [1]
查看完整版本: strcpy函数不安全问题