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
麻烦各位大神帮忙看下该怎么改啊 第一行加上:#define _CRT_SECURE_NO_WARNINGS 永恒的蓝色梦想 发表于 2020-7-4 15:40
第一行加上:
你好请问为什么运行结果会出现,cout的结果是一个“?”的情况呢 本帖最后由 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)
这是改法二,也就是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]