运行空白,求助
#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 == 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 = chars;
}
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 != T.ch) {
//TODO
return S.ch - T.ch;
}
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 == 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 = chars;
}
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 != T.ch) {
//TODO
return S.ch - T.ch;
}
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字符串
有用请设置最佳谢谢
另:个签打错了:古今多少事,都付笑谈中这是两个分句 ExiaGN001 发表于 2023-2-23 21:48
有些情况下,用char*存包括汉字的两字节字符,是会炸的。
返回值:0xC0000374
代表着堆出错了
成功运行,个签已改,感谢!{:10_256:}
页:
[1]