我正在使用一个接受全名作为输入并按顺序打印出来的函数:名字,中间名,姓氏。
问题是我的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);
}
答案 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
循环中。我可能每行定义一个变量,并且可能不会使用count
或a
。
对strlen()
的调用不应处于循环状态。我不确定您如何应付我的名字-我没有中间名。我认为您可以完全避免使用while
循环。我也不相信您也需要for
循环。这些是单独的讨论。
我不是要解决算法问题-这不是问题中的问题的答案(因此不应该接受),而是comment中问题的答案,由于代码无法在注释中格式化,因此我无法在注释中理智地回答它;因此,这“不是答案”,而是“旨在对OP的辅助问题有所帮助”。