簡體   English   中英

C-不能在strtok中使用strcpy

[英]C - Can not use strcpy with strtok

我正在使用一個接受全名作為輸入並按順序打印出來的函數:名字,中間名,姓氏。

問題是我的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);
}

復制first時(即標識了所有標記),將再次輸入while循環(請注意,標記不是NULL,但在這種情況下指向first)。 現在將調用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++;                                                                    
} 

這更像是我在問題中顯示代碼的方式—在通過編譯器傳遞之前:

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循環。 這些是單獨的討論。

我不是在嘗試解決算法問題—這不是對問題中問題的解答(因此不應接受),而是對注釋中問題的解答,並且由於代碼無法格式化為評論,我不能在評論中理智地回答; 因此,這“不是答案”,而是“旨在幫助OP的輔助問題”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM