编译错误deprecated conversion from string constant to 'char*' [-Wwrite-strings]
本人在编译一道题的时候遇到了该编译错误:
deprecated conversion from string constant to ‘char*’ [-
Wwrite-strings];(首先用char *定义了函数中的常量)
汉语意思就是不赞成将字符串常量转换为’char*’;
问题是这样产生的,先看这个函数原型:
void someFunc(char *someStr);
再看这个函数调用:
someFunc(“I’m a string!”);
把这两个东西组合起来,用最新的g++编译一下就会得到标题中的警告。
为什么呢?原来char *背后的含义是:给我个字符串,我要修改它(首先应该存在一个字符串其里面应有内容,才可修改)
而理论上,我们传给函数的字面常量是没法被修改的。
诸如:
假定你想使用一个char*类型的变量,有时指向一个字符串,有时指向另外一个字符串。开始的代码就像这样:
char *msg;
msg = “hello”;
msg = “good-bye”;
编译器会对这段代码给出两段警示,说”deprecated conversion from string constant to ‘char *’”,意思就是说你没有能力修改字符串的内容。如果将代码写成这样,如:
char *msg = “hello”;
*msg = ‘j’;
printf( “%s\n”, “hello” );
所以说,比较合理的办法是把参数类型修改为const char *。
这个类型说背后的含义是:给我个字符串,我只要读取它。
const:
const(五大内存分区之常量存储区)是一个C语言的关键字,它限定一个变量不允许被改变(正好符合我们的要求)。
这是该题:
PTA 6-8 查找星期 (15分)
本题要求实现函数,可以根据下表查找到星期,返回对应的序号。
序号 | 星期 |
---|---|
0 | Sunday |
1 | Monday |
2 | Tuesday |
3 | Wednesday |
4 | Thursday |
5 | Friday |
6 | Saturday |
函数接口定义:
int getindex( char *s );
函数getindex应返回字符串s序号。如果传入的参数s不是一个代表星期的字符串,则返回-1。
裁判测试程序样例:
#include
#include
#define MAXS 80
int getindex( char *s );
int main()
{
int n;
char s[MAXS];
scanf(“%s”, s);
n = getindex(s);
if ( n==-1 ) printf(“wrong input!\n”);
else printf(“%d\n”, n);
return 0;
}
/* 你的代码将被嵌在这里 */
本人一开始对a[] 只采用char *定义,但是我们是要保证该常量不被修改,所以应该在其前面再加const以保证其不被修改;
以下为其正确答案
getindex( char *s )
{
const char *a[]={
"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
for(int i=0;i<7;i++)
if(strcmp(s,a[i])==0)
return i;
return -1;
}
而采用指针访问法也不会出现该编译警告;以下为此答案:
int getindex( char *s )
{
char *a[]={
"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
for(int i=0;i<7;i++)
if(strcmp(s,*(a+i))==0)
return i;
return -1;
}
以上为对常量的初步理解,fighting!!!
还没有评论,来说两句吧...