将来自用户的字符串作为单个命令行参数,标记化并显示它

时间:2019-09-13 05:30:07

标签: c string dynamic command-line-interface

从用户那里获取一个字符串作为单个命令行参数。令牌化并将其存储在适当的数据结构中,然后显示它。

我尝试了这段代码,但它给了我分段错误。我无法找到它在哪里。

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


#define delim " "

int main(int argc, char *argv[])
{

    if(argc!=2)
    {
        printf("\nPlease enter only one argument as a single line string.\n");
        exit (-1);
    }

    char *tmp1=NULL;
    int len=0;
    int count=0;
    int i=0;
    len=strlen(argv[1]);
    tmp1=(char *)malloc(sizeof(char)* (len)+1);

    if(NULL==tmp1)
    {
        printf("Memory allocation failure single ptr.");
        exit (-1);
    }

    strcpy(tmp1,argv[1]);
    char *tok=NULL;
    char **data=NULL;
    tok=strtok(tmp1,delim);

    while(NULL!=tok)
    {
        count++;
        tok=strtok(NULL,delim);
    }

     strcpy(tmp1,argv[1]);

     data=(char**)malloc(sizeof(char*)*count);
     if(NULL==data)
     {
         printf("Memory allocation failure double ptr.");
         exit (-1);
     }


     tok=strtok(tmp1,delim);
     while (NULL!=tok)
     {
         int l=strlen(tok);
         data[i]=(char *)malloc(sizeof(char)*l)+1);
         if(NULL==data[i])
         {
             printf("Memory allocation failure ");
             exit (-1);
         }


         strcpy(data[i],tok);
         tok=strtok(NULL,delim);
         i++;
     }

     for (i=0; i<count; i++)
     {
         printf("%s\t",data[i]);
     }
     for (i=0; i<count; i++)
     {
         free(data[i]);
         data[i]=NULL;
     }
     data=NULL;

     free(tmp1);
     tmp1=NULL;
     return 0;
}

我传递了“你好,这是字符串”,它导致分段错误。

1 个答案:

答案 0 :(得分:0)

据我从运行代码中了解到的那样,您想输入一个字符串作为参数,然后解析并打印它,就这么简单吗?

由于输入错误,代码无法编译

data[i]=(char *)malloc(sizeof(char)*l)+1);

将其修复为:

data[i]=(char *)malloc(sizeof(char)*l+1);

对于“你好,这是字符串”,代码的输出为:

hello   this    is      string                                                                                                                           

...Program finished with exit code 0 

如果您仍然存在细分错误,请发布更多信息