|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include<stdio.h>
- #include<stdlib.h>
- #include<stdarg.h>
- #define TRUE 1
- #define ERROR -1
- //串的堆分配储存表示
- typedef struct {
- char *ch;//若是非空字符串,则按串长分配存储区,否则ch为NULL
- int length;//串长度
- } HString;
- HString StrAssign(HString Str, char* chars) {
- //生成一个其值等于串常量的chars的串T
- if (Str.ch) {
- //释放T的空间
- free(Str.ch);
- }
- int len = 0;
- printf_s("chars=%s\n", chars);
- while (1) {
- ++len;
- if (chars[len] == 0) {
- //TODO
- break;
- }
- }
- if (!len) {
- //长度为0为ch赋NULL值
- Str.ch = NULL;
- Str.length = 0;
- } else {
- if (!(Str.ch = (char*)malloc(len * sizeof(char)))) {
- //空间不足退出
- exit(ERROR);
- }
- for (int i = 0; i <= len - 1; i++) {
- //TODO
- Str.ch[i] = chars[i];
- }
- Str.length = len;
- }
- return Str;
- }
- int StrLength(HString S) {
- return S.length;
- }
- int StrCompares(HString S, HString T) {
- // 若S>T,则返回值>0;若S<T,则返回值=0,若S<T,则返回值<0
- printf_s("123\n");
- for (int i = 0; i <= S.length && i < T.length; ++i) {
- //TODO
- if (S.ch[i] != T.ch[i]) {
- //TODO
- return S.ch[i] - T.ch[i];
- }
- printf_s("i的值为%d\n", i);
- }
- return S.length - T.length;
- }
- int main(void) {
- HString T, S, M;
- char* Tchars = "Hello World!";
- char* Schars = "Hello C!";
- char* message = "";
- T = StrAssign(M, Tchars);
- printf_s("字符串为%s\n", Tchars);
- printf_s("字符串长度为%d\n", T.length);
- S = StrAssign(M, Schars);
- printf_s("字符串为%s\n", Schars);
- // 删除该行运行正常
- message = StrCompares(S, T) == 0 ? "S字符串大于T字符串" : "S字符串大于或小于T字符串";
- printf_s("%s\n", message);
复制代码
本帖最后由 ExiaGN001 于 2023-2-23 21:56 编辑
有些情况下,用char*存包括汉字的两字节字符,是会炸的。
返回值:0xC0000374
代表着堆出错了
因为message指向的地方只有1字节,存不了那么大的数据。
将message有关部分删去并用原三目运算符替代message就可以了
发上来的代码有个致命的语法bug:
main函数没封口。这是初学者犯得最多的问题之一
改完的代码:
- #include<stdio.h>
- #include<stdlib.h>
- #include<stdarg.h>
- #define TRUE 1
- #define ERROR -1
- //串的堆分配储存表示
- typedef struct {
- char *ch;//若是非空字符串,则按串长分配存储区,否则ch为NULL
- int length;//串长度
- } HString;
- HString StrAssign(HString Str, char* chars) {
- //生成一个其值等于串常量的chars的串T
- if (Str.ch) {
- //释放T的空间
- free(Str.ch);
- }
- int len = 0;
- printf_s("chars=%s\n", chars);
- while (1) {
- ++len;
- if (chars[len] == 0) {
- //TODO
- break;
- }
- }
- if (!len) {
- //长度为0为ch赋NULL值
- Str.ch = NULL;
- Str.length = 0;
- } else {
- if (!(Str.ch = (char*)malloc(len * sizeof(char)))) {
- //空间不足退出
- exit(ERROR);
- }
- for (int i = 0; i <= len - 1; i++) {
- //TODO
- Str.ch[i] = chars[i];
- }
- Str.length = len;
- }
- return Str;
- }
- int StrLength(HString S) {
- return S.length;
- }
- int StrCompares(HString S, HString T) {
- // 若S>T,则返回值>0;若S<T,则返回值=0,若S<T,则返回值<0
- printf_s("123\n");
- for (int i = 0; i <= S.length && i < T.length; ++i) {
- //TODO
- if (S.ch[i] != T.ch[i]) {
- //TODO
- return S.ch[i] - T.ch[i];
- }
- printf_s("i的值为%d\n", i);
- }
- return S.length - T.length;
- }
- int main(void) {
- HString T, S, M;
- char* Tchars = "Hello World!";
- char* Schars = "Hello C!";
-
- T = StrAssign(M, Tchars);
- printf_s("字符串为%s\n", Tchars);
- printf_s("字符串长度为%d\n", T.length);
- S = StrAssign(M, Schars);
- printf_s("字符串为%s\n", Schars);
- printf_s("%s\n", StrCompares(S, T) == 0 ? "S字符串大于T字符串" : "S字符串大于或小于T字符串");
- }
复制代码
在我这边的运行结果:(以供校验)
- chars=Hello World!
- 字符串为Hello World!
- 字符串长度为12
- chars=Hello C!
- 字符串为Hello C!
- 123
- i的值为0
- i的值为1
- i的值为2
- i的值为3
- i的值为4
- i的值为5
- S字符串大于或小于T字符串
复制代码
有用请设置最佳谢谢
另:个签打错了: 这是两个分句
|
|