0

编辑:好的,所以出于某种原因,我认为 scanf 行会在整行中读取为字符串(多个参数)。脑子真的要炸了。谢谢大家的帮助。

我正在尝试将一些字符放入数组中。这是代码的外观。

编辑:添加更多代码以希望能更清楚地解决问题 Edit2:我可以将 char 指针“消息”视为此函数中的字符串吗?

//in main...
printf( "Enter a command> " );
scanf( "%s", buf );
message = convertMessage( buf );
//....

char* convertMessage( char *message ){
    char *convMess = calloc( 50, sizeof(char) );
    char *tok = strtok( message, " ," );

    if( convMess == NULL ){
        perror( "memory error" );
        exit(-5);
    }

    if( strcmp( tok, "get" ) == 0 ){
        tok = strtok( NULL, " ," );
        if( strcmp( tok, "lname" ) == 0 ){
            convMess[0] = '1';   // seg faults on this line
            convMess[1] = ' ';
            strcat( convMess, tok );
            return convMess;
        }
        else if( //...        
            //...and so on
//output from gdb
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400e5d in convertMessage (
message=0x7fffffffbfa0 "get") at client.c:135
135             if( strcmp( tok, "lname" ) == 0 ){
(gdb) quit

我知道我可能误解了一些非常简单的东西,但我一直在研究这段代码很长时间,我觉得我的脑子已经炸了。另外,我检查了在线参考资料,cplusplus.com/reference 上的代码看起来和我的一样。

谢谢您的帮助。

4

2 回答 2

3

您可能正在为 64 位平台进行编译而不包括stdlib.h- 如果没有声明/原型calloc()编译器将截断返回的指针到 an int(假设 anint是 32 位)。

使用适当的编译器选项让编译器为此类事情生成警告或错误。

于 2013-06-20T07:12:24.330 回答
2

从您的帖子中,我看到第 135 行中的应用程序段错误:

if( strcmp( tok, "lname" ) == 0 ){

最有可能的是,你正在传递toktok存在NULL

在第 134 行分配了它之后,tok您可能想要检查它的值:NULL

tok = strtok( NULL, " ," );

在将其传递给 之前strcmp(),例如:

 tok = strtok( NULL, " ," );
 if (tok != NULL) {
   if (strcmp( tok, "lname" ) == 0 ) {
   ...
 }
于 2013-06-20T07:40:28.227 回答