C-不能在strtok中使用strcpy

时间:2018-06-20 04:57:52

标签: c strtok strcpy

我正在使用一个接受全名作为输入并按顺序打印出来的函数:名字,中间名,姓氏。

问题是我的while循环似乎无限,我还没弄清楚如何解决它。

这是我的功能:

void order(char ar[])
{
    int i, count=0, a=1;
    char* token;
    char last[20], middle[20], first[20],c;
    char s[]=" ";
    for(i=0;i<strlen(ar)-1;i++)
        if(ar[i]==' ') count++;

    token=strtok(ar,s);
    strcpy(last,token);


    while(token!=NULL)
    {
        token=strtok(NULL,s);
        if(a<count) strcpy(middle,token);
        else strcpy(first,token);
        a++; 
    }
    printf("%s %s %s",first,middle,last);
}

2 个答案:

答案 0 :(得分:1)

当第一个被复制时(即标识了所有令牌),将再次进入while循环(请注意,令牌不是NULL,但在这种情况下指向第一个)。现在将调用strtok()并将返回NULL。代码将转到else部分,并尝试使用strcpy(),这会导致问题。

在strcpy()之前检查NULL。我这样做是这样的,而且效果很好。

while(token!=NULL)                                                          
{                                                                           
    token=strtok(NULL,s);                                                   
    if (token == NULL)                                                      
      break;                                                                
    if(a<count) strcpy(middle,token);                                       
    else strcpy(first,token);                                               
    a++;                                                                    
} 

答案 1 :(得分:1)

这更像是我在问题中显示代码的方式—在通过编译器传递代码之前:

void order(char ar[])
{
    int count = 0, a = 1;
    char *token;
    char last[20], middle[20], first[20];
    char s[] = " ";

    for (int i = 0; i < strlen(ar) - 1; i++)
    {
        if (ar[i] == ' ')
            count++;
    }

    token = strtok(ar, s);
    strcpy(last, token);

    while (token != NULL)
    {
        token = strtok(NULL, s);
        if (a < count)
            strcpy(middle, token);
        else
            strcpy(first, token);
        a++;
    }
    printf("%s %s %s", first, middle, last);
}

您可以争论括号的位置-我使用Allman,但是1TBS是一种广泛使用的替代样式。我建议选择这两个之一。如果循环多于一行,我会在循环的主体周围放置大括号; YMMV。

在运算符周围使用更多空白。不要定义未使用的变量(c消失了)。我将int i放在了for循环中。我可能每行定义一个变量,并且可能不会使用counta

strlen()的调用不应处于循环状态。我不确定您如何应付我的名字-我没有中间名。我认为您可以完全避免使用while循环。我也不相信您也需要for循环。这些是单独的讨论。

我不是要解决算法问题-这不是问题中的问题的答案(因此不应该接受),而是comment中问题的答案,由于代码无法在注释中格式化,因此我无法在注释中理智地回答它;因此,这“不是答案”,而是“旨在对OP的辅助问题有所帮助”。