鱼C论坛

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

[已解决]运行空白,求助

[复制链接]
发表于 2023-2-23 21:36:07 | 显示全部楼层 |阅读模式

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

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

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);
最佳答案
2023-2-23 21:48:19
本帖最后由 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字符串

有用请设置最佳谢谢
另:个签打错了:
古今多少事,都付笑谈中
这是两个分句
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-23 21:48:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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字符串

有用请设置最佳谢谢
另:个签打错了:
古今多少事,都付笑谈中
这是两个分句
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-2-23 23:04:49 | 显示全部楼层
ExiaGN001 发表于 2023-2-23 21:48
有些情况下,用char*存包括汉字的两字节字符,是会炸的。
返回值:0xC0000374
代表着堆出错了

成功运行,个签已改,感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 19:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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