C 程序在关闭时崩溃

C 程序在关闭时崩溃,c,crash,C,Crash,所以,这是我第一次在这里发帖,我会尽量具体。 我必须为我的学校制定一个计划,上面写着: 首先编写一个函数,该函数获取一个字符并返回: 如果是大写字母,则使用相同的字符 大写字母,如果是小写字母 如果是数字,则使用反斜杠(“\”) 任何其他情况下的星号('*') 然后,使用你的函数,制作一个程序,得到一个字符串,并在函数更改后重新打印它。它应该一直请求一个新字符串,直到用户键入'QUIT',在这种情况下,它将打印'Bye!'然后退出 这是我的密码: #include <stdio.h>

所以,这是我第一次在这里发帖,我会尽量具体。 我必须为我的学校制定一个计划,上面写着:

首先编写一个函数,该函数获取一个字符并返回:

  • 如果是大写字母,则使用相同的字符
  • 大写字母,如果是小写字母
  • 如果是数字,则使用反斜杠(“\”)
  • 任何其他情况下的星号('*')
  • 然后,使用你的函数,制作一个程序,得到一个字符串,并在函数更改后重新打印它。它应该一直请求一个新字符串,直到用户键入'QUIT',在这种情况下,它将打印'Bye!'然后退出

    这是我的密码:

    #include <stdio.h>
    #include <stdlib.h>
    
    char fnChange(char c)
    {
         if (c > 'a'-1 && c < 'z'+1)
              c = c - 32;
         else if (c > '0'-1 && c < '9'+1)
              c = '\\' ;
         else if ( c > 'A'-1 && c < 'Z'+1)
              c = c;
         else 
              c = '*';
         return c;
    }
    
    
    int main()
    {   
        int i, refPoint;
        char *str = (char*)malloc(10);
        //without the next one, the program crashes after 3 repeats.
        refPoint = str;
        while (1==1) {            
           printf("Give a string: ");
           str = refPoint;//same as the comment above.
           free(str);
           scanf("%s",str);
             if (*str == 'Q' && *(str+1) == 'U' && *(str+2) == 'I' && *(str+3) == 'T') {
               // why won't   if (str == 'QUIT')   work?
               free(str);
               printf("Bye!");     //after printing "Bye!", it crashes.
               system("pause");    //it also crashes if i terminate with ctrl+c.
               exit(EXIT_SUCCESS); //or just closing it with [x].
             }       
             printf("The string becomes: ");
             while (*str != '\0') {
               putchar(fnChange(*str));
               str++;
             }
          printf("\n");
        }
    }
    
    #包括
    #包括
    字符变化(字符c)
    {
    如果(c>'a'-1&&c<'z'+1)
    c=c-32;
    否则如果(c>0'-1&&c<9'+1)
    c=“\\”;
    如果(c>'A'-1&&c<'Z'+1)
    c=c;
    其他的
    c='*';
    返回c;
    }
    int main()
    {   
    int i,参考点;
    char*str=(char*)malloc(10);
    //如果没有下一个,程序在重复3次后崩溃。
    refPoint=str;
    而(1==1){
    printf(“给出一个字符串:”);
    str=refPoint;//与上面的注释相同。
    自由基(str);
    scanf(“%s”,str);
    如果(*str='Q'&&*(str+1)='U'&&*(str+2)='I'&&*(str+3)='T'){
    //为什么(str=='QUIT')不起作用?
    自由基(str);
    printf(“Bye!”);//打印“Bye!”后,它崩溃。
    系统(“暂停”);//如果使用ctrl+c终止,它也会崩溃。
    退出(exit_SUCCESS);//或者用[x]关闭它。
    }       
    printf(“字符串变为:”);
    而(*str!='\0'){
    putchar(fnChange(*str));
    str++;
    }
    printf(“\n”);
    }
    }
    
    大不不,不允许在释放动态分配的内存后使用它。最重要的是,您可以在循环中再次释放它

    这样做是不明确的行为。这几乎可以肯定是你坠机的原因


    还有几个其他问题。您可以使用
    您的代码中有多个案例

    首先,将指针指定给整型变量。这些并不真正兼容(例如,想想如果
    int
    的大小是32位,指针的大小是64位,会发生什么情况)

    然后在使用分配的指针之前释放它,从而写入未分配的内存


    然后再次在同一个指针上调用
    free

    这会导致崩溃的原因有很多。按照代码的顺序,或多或少:

    free
    str,然后扫描它。一旦释放内存,它就不再可用

    然后是scanf:
    scanf(“%s”,str)
    。A一旦有人在控制台输入10个或更多字符的字符串,您就进入了未定义行为的领域,因为内存将被覆盖

    str
    赋值给
    refpoint
    ,反之亦然,会给您带来大量编译器警告。一个变量是
    int
    ,另一个变量是
    char*
    。在某些体系结构上,指针不适合
    int
    ,程序一使用它就会崩溃

    while循环递增
    str
    。如果没有从
    refpoint
    进行(危险的)复制,您将试图释放一个不是
    malloc
    结果的指针。这是未定义的行为,可能会崩溃

    顺便说一下:

    请不要强制转换
    malloc
    的结果。它返回一个void*,在C中,您可以为任何内容指定一个
    void*
    ,不必要的强制转换会降低代码的可读性。选角意味着你正在做一些不寻常的事情,而这个任务不是


    您不能执行
    str==“QUIT
    ”,因为C编译器会将字符串的地址与-进行比较,那么,键入“QUIT”的效果取决于编译器。它可能会将其与“Q”的字符值进行比较。即使使用
    str==“QUIT”
    它也会将指针
    str
    (即
    malloc
    返回的地址)的值与字符串“QUIT”的地址进行比较,该字符串将位于链接器设计存储它的任何位置。C不进行字符串比较,您必须使用strcmp进行比较。

    str=refPoint
    ??
    free(str)
    然后使用scanf(“%s”,str)
    ?????你到底希望发生什么???一个小问题(你的代码确实存在问题,请参见下面的Joachim的回答),而不是
    c>'A'-1
    ,你真的应该写
    c>='A'
    。或者,更好的是,只需使用。
    refPoint=str<代码>参照点
    不是指针!“为什么if(str=='QUIT')不起作用?”-因为您需要像
    strcmp()
    这样的函数来比较字符串:
    if(strcmp(str,“QUIT”)==0{..}
    free(str);
    scanf("%s",str);
    
    if  ((c >= 'a') && (c <= 'z')) ...
    
    c = c - 'A' + 'a';
    
    if (strcmp (str, "QUIT") == 0) ...