分段核心转储项目中的错误

时间:2014-11-27 03:15:52

标签: c

我一直在收到错误

  

分段错误(核心转储)

我在Codeblocks IDE linux中编译我的C代码。

我浏览了一下,甚至尝试了解决之前在stackOverflow上提出的问题,但无济于事。

有人可以帮忙。

这是我的代码:

  
    

`

  
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Declaration of Global Variables */
char  message, chat ;
char user, pass, to, from;
int choice, response;
char filename[];
char buffer;


/* The API response Handler */
void fileHandler(int typ){

    /*
        typ = 0 for ordinary responses
        typ = 1 to get chat data
     */

     if( typ == 0 ){
        filename[13] = "response.chat";
     }else if(typ == 1){
        filename[9] = "chat.chat";
     }

    FILE *p;
    if( ( p=fopen(filename,p)!=NULL) )
        puts(chat);
    fclose(p);

}

/* The loged in user handler */
void logedIn(){

    printf("Welcome!\n\nPlease select an action:\n\t1.  Send Message\n\t2.    Read Messages\n\t3.   Delete Account");
    scanf("%d", choice);

    switch(choice){

        case 1:
        //Chat
            printf("Enter Recipient: ");
            scanf("%s", &to);
            printf("Enter Message: ");
            scanf("%s", &message);

            snprintf(buffer, 999, "php interface.php doChat %s %s %s", to, user, message );
            system( buffer );
            fileHandler(0);

        break;

        case 2:
        //read message
            snprintf(buffer, 999, "php interface.php readChat %s", user );
            system( buffer );
            fileHandler(1);
        break;

        case 3:
        //delete account
            snprintf(buffer, 999, "php interface.php delUser %s", user );
            system( buffer );
            fileHandler(0);
            abort();
        break;

        default:
            system("clear");
            logedIn();
        break;

    }

}


/* The user addition handler */
void addUser(){

    snprintf(buffer, 999, "php interface.php addUser %s %s", user, pass);
    system( buffer );
    fileHandler(0);

    printf("USER ADDED!");
    system("clear");
    main();

}

/* The login request handler */
void doLogin(){
    snprintf(buffer, 999, "php interface.php doLogin %s %s", user, pass);
    system( buffer );
    fileHandler(0);

    logedIn();

}

/*  The chat message send handler */
void doChat(){

}

/* The user delete handler */
void delUser(){
    snprintf(buffer, 999, "php interface.php delUser %s ", user);
    system( buffer );
    fileHandler(0);

    printf("USER DELETED!");
    system("clear");
    abort();
}


/* The chat render handler */

int main()
{

    printf("\t\t\t\tMyC CHAT\n\n\t\t\tSELECT AN ACTION:\n\t\t\t1.    Signup\n\t\t\t2.    Login\n\t\t\t3.     Exit\n\t\t\t:");
    scanf("%d", &choice);

    switch ( choice ){

        case 1:
            /* Do a user signup */
            system("clear");
            printf("USER LOGIN");
            printf("\nEnter username :");
            scanf( "%s", &user );
            printf("\n\nEnter Password: ");
            scanf( "%s", &pass );

            addUser();

        break;

        case 2:
            /* Do a user login */
            system("clear");
            printf("USER LOGIN");
            printf("\nEnter username :");
            scanf( "%s", &user );
            printf("\n\nEnter Password: ");
            scanf( "%s", &pass );

            doLogin();

        break;

        case 3:
            abort();
            /* Exit */
        break;

        default:
            /* Give the user another chance */
            system("clear");
            main();
        break;

    }


}

`

在Ubuntu 14.04上运行

尝试使用写入文件的php文件实现简单的聊天系统。

谢谢。

2 个答案:

答案 0 :(得分:3)

您的代码中有很多错误,因为@SSC建议使用所有警告编译代码。并使用gdb或其他一些调试器来识别崩溃。

但首先,在main()你有

scanf( "%s", &user );
...
scanf( "%s", &pass );

userpass char不是char *也不是char数组。因此,当您读取用户名时,它将覆盖内存。您需要使用char *相应地分配内存或使用char数组。

还有

scanf("%d", choice);

应该是

scanf("%d", &choice);
//----------^

答案 1 :(得分:1)

代码的问题主要是声明不好的变量。 特别是存储文件输入的缓冲区变量。

然而,主要错误是动态分配的#34;变量

  

&#34;文件名&#34;被改为&#34; fil&#34;并作为fileHandler函数中的参数传递

 /* Declaration of Global Variables */
char  message, chat ;
char user, pass, to, from;
int choice, response;
char filename[];
char buffer;

在坐立不安整夜并阅读无数手册之后[这些手册并不是很好吃的](是的,我显然是一个菜鸟!)

我在变量上尝试了很多不同的东西,然后想出了

int choice, resp;
char user[], pass[], to[], message[], from[], chat[9999], buffer[9999];
  

感谢Michel @ ueab的​​支持!!

功能性但图形和功能上可怕的应用程序可以在以下位置找到:

  

https://github.com/ianmin2/chat