c - 结构、strtok、段错误

标签 c struct command-line-arguments strtok

我正在尝试制作一个包含结构和文件的程序。以下只是我的代码的一部分(不是整个程序)。 我想做的是:要求用户写下他的命令。例如。删除约翰 例如。输入 John James 5000 ipad 购买。

问题是我想拆分命令以便为结构元素保存它的“args”。这就是我使用 strtok 的原因。但是我面临另一个问题,即谁将这些“放在”结构上。 此外,如何以安全的方式将“args”“传递”给结构对我来说似乎很奇怪,因为我将所有输入(来自用户)保存在一个二进制文件中,该文件可能会重新打开和重写,所以我不能使用:

strcpy(catalog[0]->short_name, args[1]); 

因为是时候将短名称保存在结构的第一个元素中了。但是,如果文件被写入,会发生什么?第一个元素存在,所以如果我写 ..[0]我会写下来吗? 我应该怎么办?提前感谢您的帮助! :D

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100

char command[1500]; 

struct catalogue                
{
        char short_name[50];
        char surname[50];
        signed int amount;
        char description[1000];
}*catalog[MAX]; 

int main ( int argc, char *argv[] )
{
    int i,n;
    char choice[3];

    printf(">sort1: Print savings sorted by surname\n");
    printf(">sort2: Print savings sorted by amount\n");
    printf(">search+name:Print savings of each name searched\n");
    printf(">delete+full_name+amount: Erase saving\n");
    printf(">enter+full_name+amount+description: Enter saving \n");
    printf(">quit:  Update + EXIT program.\n");

    printf("Choose your selection:\n>");
    gets(command);                     //it save the whole command

    /*in choice it;s saved only the first 2 letters(needed for menu choice again)*/
    strncpy(choice,command,2);      
    choice[2]='\0';                   

char** args = (char**)malloc(strlen(command)*sizeof(char*));
memset(args, 0, sizeof(char*)*strlen(command));

char* temp = strtok(command, " \t");

for (n = 0; temp != NULL; ++n)
{   
    args[n] = strdup(temp);
    temp = strtok(NULL, " \t");
    printf(" %s ",args[n]);
}

strcpy(catalog[0]->short_name, args[1]);         //segmentation fault
strcpy(catalog[0]->surname,args[2]);
catalog[0]->amount=atoi(args[3]);               //atoi doesn't work
strcpy(catalog[0]->description,args[4]);


}

结果,在运行程序后我得到一个段错误... 对于该行:

strcpy(catalog[0]->short_name, args[1]); 

有什么帮助吗?有什么想法吗?

最佳答案

您有 2 个错误:

  1. 您的 catalog[MAX] 数组包含指向您的 struct catalogueMAX 指针,但它们都没有被初始化。解决这个问题的方法是要么不将它们声明为指针,要么根据需要对它们进行 malloc,例如 catalog[0] = (struct catalog *)malloc(sizeof(struct catalog ));

  2. 您的 args 变量有问题。首先,我认为您不打算创建一个长度为命令字符串长度的字符串数组。这意味着如果您键入“sort1”,您将创建 args[5]。这是荒谬的,因为你的命令的长度与它应该有多少参数无关。

    但假设您真的想这样做,您正在为数组创建空间,而不是为数组中的字符串创建空间。因此,无论如何你最终都会遇到段错误(尽管你得到的是上面的#1)。您需要在使用时为 args 中的每个元素分配空间。

代码可能是这样的:

for (n = 0; temp != NULL; ++n)
{
   args[n] = (char *)malloc((strlen(temp) + 1) * sizeof(char));
   strcpy(args[n], temp);
   // and so on
}

关于c - 结构、strtok、段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2834374/

相关文章:

c - 循环程序输出

c# - C 指针结构 - buffer 指向另一个结构。如何在 C# 中?

c - 当我将指针设置为 NULL 时我的程序崩溃

c++ - 在 C++ 中解析命令行参数?

python argparse遇到 '$'后停止解析

c++ - 将 char * 作为函数参数传递时出现意外行为

c - C是否支持 union 的匿名成员?

sql - 通过 BigQuery 中的联接构建多级嵌套结构(使用嵌套和重复字段)

c - 单一函数可处理两种类型的链表

python - 如何在 Python 中处理命令行参数?