[英]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
循環中。 我可能會在每行定義一個變量,並且可能不會使用count
或a
。
對strlen()
的調用不應處於循環條件下。 我不確定您如何應付我的名字-我沒有中間名。 我認為您可以完全避免while
循環。 我也不相信您也需要for
循環。 這些是單獨的討論。
我不是在嘗試解決算法問題—這不是對問題中問題的解答(因此不應接受),而是對注釋中問題的解答,並且由於代碼無法格式化為評論,我不能在評論中理智地回答; 因此,這“不是答案”,而是“旨在幫助OP的輔助問題”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.