编译错误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分)
本题要求实现函数,可以根据下表查找到星期,返回对应的序号。

序号星期
0Sunday
1Monday
2Tuesday
3Wednesday
4Thursday
5Friday
6Saturday

函数接口定义:

int getindex( char *s );

函数getindex应返回字符串s序号。如果传入的参数s不是一个代表星期的字符串,则返回-1。

裁判测试程序样例:

#include <stdio.h>
#include <string.h>
#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!!!

  • 23
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值