鱼C论坛

 找回密码
 立即注册
查看: 3869|回复: 2

[已解决]const char 与char不兼容问题

[复制链接]
发表于 2020-5-29 10:33:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在写串的cpp中出现这种问题,其中红色部分报错,显示const char 与char不兼容,我尝试在前面加上(char* )强制转化,接下来编译无报错,但调试出现重定义报错,代码如下
sqstring.cpp中源程序代码:
  1. #include <stdio.h>
  2. #define MaxSize 100
  3. typedef struct
  4. {
  5.     char data[MaxSize];
  6.     int length;
  7. } SqString;
  8. void StrAssign(SqString& s, char cstr[])//将字符串常量赋给串s
  9. {
  10.     int i;
  11.     for (i = 0; cstr != '\0'; i++)
  12.         s.data = cstr;
  13.     s.length = i;
  14. }
  15. void DestroyStr(SqString& s)//销毁串
  16. {}
  17. void StrCopy(SqString& s, SqString t)//串复制
  18. {
  19.     for (int i = 0; i < t.length; i++)
  20.         s.data = t.data;
  21.     s.length = t.length;
  22. }
  23. bool StrEqual(SqString s, SqString t)//判串相等
  24. {
  25.     bool same = true;
  26.     if (s.length != t.length)
  27.         same = false;
  28.     else
  29.         for (int i = 0; i < s.length; i++)
  30.             if (s.data != t.data)
  31.             {
  32.                 same = false;
  33.                 break;
  34.             }
  35.     return same;
  36. }
  37. int StrLength(SqString s)//求串长
  38. {
  39.     return s.length;
  40. }
  41. SqString Concat(SqString s, SqString t)//串连接
  42. {
  43.     SqString str;
  44.     int i;
  45.     str.length = s.length + t.length;
  46.     for (i = 0; i < s.length; i++)
  47.         str.data = s.data;
  48.     for (i = 0; i < t.length; i++)
  49.         str.data[s.length + i] = t.data;
  50.     return str;
  51. }
  52. SqString SubStr(SqString s, int i, int j)//求子串
  53. {
  54.     SqString str;
  55.     int k;
  56.     str.length = 0;
  57.     if (i <= 0 || i > s.length || j<0 || i + j - 1>s.length)
  58.         return str;
  59.     for (k = i - 1; k < i + j - 1; k++)
  60.         str.data[k - i + 1] = s.data[k];
  61.     str.length = j;
  62.     return str;
  63. }
  64. SqString InsStr(SqString s1, int i, SqString s2)//插入子串
  65. {
  66.     int j;
  67.     SqString str;
  68.     str.length = 0;
  69.     if (i <= 0 || i > s1.length + 1)
  70.         return str;
  71.     for (j = 0; j < i - 1; j++)
  72.         str.data[j] = s1.data[j];
  73.     for (j = 0; j < s2.length; j++)
  74.         str.data[i + j - 1] = s2.data[j];
  75.     for (j = i - 1; j < s1.length; j++)
  76.         str.data[s2.length + j] = s1.data[j];
  77.     str.length = s1.length + s2.length;
  78.     return str;
  79. }
  80. SqString DelStr(SqString s, int i, int j)//删除子串
  81. {
  82.     int k;
  83.     SqString str;
  84.     str.length = 0;
  85.     if (i <= 0 || i > s.length || i + j > s.length + 1)
  86.         return str;
  87.     for (k = 0; k < i - 1; k++)
  88.         str.data[k] = s.data[k];
  89.     for (k = i + j - 1; k < s.length; k++)
  90.         str.data[k - j] = s.data[k];
  91.     str.length = s.length - j;
  92.     return str;
  93. }
  94. SqString RepStr(SqString s, int i, int j, SqString t)//替换子串
  95. {
  96.     int k;
  97.     SqString str;
  98.     str.length = 0;
  99.     if (i <= 0 || i > s.length || i + j - 1 > s.length)
  100.         return str;
  101.     for (k = 0; k < i - 1; k++)
  102.         str.data[k] = s.data[k];
  103.     for (k = 0; k < t.length; k++)
  104.         str.data[i + k - 1] = t.data[k];
  105.     for (k = i + j - 1; k < s.length; k++)
  106.         str.data[t.length + k - j] = s.data[k];
  107.     str.length = s.length - j + t.length;
  108.     return str;
  109. }
  110. void DispStr(SqString s)//输出串s
  111. {
  112.     if (s.length > 0)
  113.     {
  114.         for (int i = 0; i < s.length; i++)
  115.             printf("%c", s.data);
  116.         printf("\n");
  117.     }
  118. }
复制代码

测试程序代码:
  1. #include "sqstring.cpp"
  2. int main()
  3. {
  4.     SqString s, s1, s2, s3, s4;
  5.     printf("顺序串的基本运算如下:\n");
  6.     printf("(1)建立串s和串s1\n");
  7.     [color=Red]StrAssign(s, "abcdefghijklmn");
  8.     StrAssign(s1, "123");[/color]
  9.     printf("(2)输出串s:"); DispStr(s);
  10.     printf("(3)串s的长度:%d\n", StrLength(s));
  11.     printf("(4)在串s的第9个字符位置插入串s1而产生串s2\n");
  12.     s2 = InsStr(s, 9, s1);
  13.     printf("(5)输出串s2:"); DispStr(s2);
  14.     printf("(6)删除串s第2个字符开始的5个字符而产生串s2\n");
  15.     s2 = DelStr(s, 2, 5);
  16.     printf("(7)输出串s2:"); DispStr(s2);
  17.     printf("(8)将串s第2个字符开始的5个字符替换成串s1而产生串s2\n");
  18.     s2 = RepStr(s, 2, 5, s1);
  19.     printf("(9)输出串s2:"); DispStr(s2);
  20.     printf("(10)提取串s的第2个字符开始的10个字符而产生串s3\n");
  21.     s3 = SubStr(s, 2, 10);
  22.     printf("(11)输出串s3:"); DispStr(s3);
  23.     printf("(12)将串s1和串s2连接起来而产生串s4\n");
  24.     s4 = Concat(s1, s2);
  25.     printf("(13)输出串s4:"); DispStr(s4);
  26.     DestroyStr(s); DestroyStr(s1); DestroyStr(s2); DestroyStr(s3); DestroyStr(s4);
  27. }
复制代码

最后谢谢鱼油解答,谢谢。
最佳答案
2020-5-29 11:32:17
这属于C/C++的一大特性,你的左操作数类型必须包含右操作数,甚至更长。比如形参声明为const char*,你可以传入char*;
反之则会产生错误;
const char* 代表的是指向字符串常量的指针,char* 是个字符指针,本身就风马牛不相及;
而且,常量字符串是放在静态存储区的,人家权限位为 r--(表示常量只读),不可写不可执行;
任何通过指针操作这个地方就是非法的,所以强制转换传参产生了程序崩溃。
============================================================================
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-29 10:48:38 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-5-29 10:54 编辑

我这报了6个Error
严重性        代码        说明        项目        文件        行        禁止显示状态
错误(活动)        E0137        表达式必须是可修改的左值        temp        C:\Users\*\source\repos\temp\temp.cpp        47
错误(活动)        E0167        "const char *" 类型的实参与 "char *" 类型的形参不兼容        temp        C:\Users\*\source\repos\temp\temp.cpp        125
错误(活动)        E0167        "const char *" 类型的实参与 "char *" 类型的形参不兼容        temp        C:\Users\*\source\repos\temp\temp.cpp        126
错误(活动)        E0513        不能将 "char *" 类型的值分配到 "char" 类型的实体        temp        C:\Users\*\source\repos\temp\temp.cpp        49
错误(活动)        E0137        表达式必须是可修改的左值        temp        C:\Users\*\source\repos\temp\temp.cpp        12
错误(活动)        E0137        表达式必须是可修改的左值        temp        C:\Users\*\source\repos\temp\temp.cpp        20
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-29 11:32:17 | 显示全部楼层    本楼为最佳答案   
这属于C/C++的一大特性,你的左操作数类型必须包含右操作数,甚至更长。比如形参声明为const char*,你可以传入char*;
反之则会产生错误;
const char* 代表的是指向字符串常量的指针,char* 是个字符指针,本身就风马牛不相及;
而且,常量字符串是放在静态存储区的,人家权限位为 r--(表示常量只读),不可写不可执行;
任何通过指针操作这个地方就是非法的,所以强制转换传参产生了程序崩溃。
============================================================================
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-4 04:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表