gpt4 book ai didi

c - 在 C 中拆分字符串会导致段错误(核心已转储)

转载 作者:行者123 更新时间:2023-12-04 09:40:00 25 4
gpt4 key购买 nike

我正在尝试从键盘读取命令之类的内容
例如start game,info1,info2我想拆分并保存这两个字符串,一个与用户输入的命令类型有关,另一个与命令有关。
到目前为止,我已经完成了这项工作,它读取并打印了由空格分隔的字符串,但之后它用这个 Segmentation fault (core dumped) 击中了我。并且控制台程序停止。

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

typedef struct
{
char *command;
char *value;
} string;

string *allocate_memory();
void split_command(char* cmd_info, string **s);

int main(void) {
char cmd[255];
memset(cmd, 0, 255);
do
{
// read command
fgets(cmd, 255, stdin);
cmd[strcspn ( cmd, "\n")] = '\0';

string *str;
str = allocate_memory();
split_command(cmd, &str);

puts(str->command);
puts(str->value);

if(!strcmp(str->command, "start"))
printf("Starting...\n");

} while(strcmp(cmd, "exit"));
printf("Exiting the command line.");
return 0;
}

string *allocate_memory() {
string *p;
if( (p = (string *) malloc(sizeof(string))) == NULL ) {
printf("Memory allocation failed\n");
exit(1);
}
return p;
}

void split_command(char* cmd_info, string **s) {

string *new;
new = allocate_memory();
char *token;
while ((token = strsep(&cmd_info, " ")) != NULL)
{
printf("%s\n", token);
new->command = strdup(token);
}
new->value = strdup(token);
puts(new->value);
*s = new;
free(cmd_info);

}

编译
gcc cmd.c -o cmd.out

输出
./cmd.out 
one two
one
two
Segmentation fault (core dumped)

我也尝试过其他东西,但我一直遇到分割错误,我真的被卡住了。
任何帮助将不胜感激。
谢谢

最佳答案

strsep()将 token 设置为 NULL当没有找到其他分隔符时。那个NULL然后是
传递给 strdup() ,导致您的段错误。

我删除了 while()split_command() (我假设它是一个简单的 command arg )
并在第二个 strdup() 之前添加了一个检查并让它工作。我还修复了一些内存泄漏:

  • 您正在分配 strmain()然后用 new 覆盖它在split_command()失去对 str 的引用.
  • 您在每次循环迭代时都分配了一个新字符串,而没有释放前一个字符串
  • 您没有释放使用 strdup() 创建的字符串

  • 此外,您正在释放 cmd_info这是在堆栈上静态分配的缓冲区。

    这是我的版本:

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

    typedef struct
    {
    char *command;
    char *value;
    } string;

    string *allocate_memory();
    void split_command(char* cmd_info, string *s);

    int main(void) {
    char cmd[255];
    string *str = allocate_memory();
    memset(cmd, 0, 255);
    do {
    fgets(cmd, 255, stdin);
    cmd[strcspn(cmd, "\n")] = '\0';

    split_command(cmd, str);

    if(!strcmp(str->command, "start"))
    printf("Starting...\n");

    free(str->command);
    free(str->value);
    } while(strcmp(cmd, "exit"));
    free(str);
    printf("Exiting the command line.");
    return 0;
    }

    string *allocate_memory() {
    string *p;
    if( (p = (string *) malloc(sizeof(string))) == NULL ) {
    printf("Memory allocation failed\n");
    exit(1);
    }
    return p;
    }

    void split_command(char* cmd_info, string *s) {
    char *token = strsep(&cmd_info, " ");

    s->command = strdup(token);
    token = strsep(&cmd_info, " ");
    if (token)
    s->value = strdup(token);
    else
    s->value = NULL;
    }

    记得路过 NULLputs()这会导致问题:始终检查 NULL !

    关于c - 在 C 中拆分字符串会导致段错误(核心已转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62375326/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com