homeskating 发表于 2023-2-23 21:36:07

运行空白,求助

#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: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 == 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字符串

有用请设置最佳谢谢
另:个签打错了:古今多少事,都付笑谈中这是两个分句

homeskating 发表于 2023-2-23 23:04:49

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


成功运行,个签已改,感谢!{:10_256:}
页: [1]
查看完整版本: 运行空白,求助