if 语句的问题,包含来自 C 中 strtok 的标记
Problem with if statements, containing token from strtok in C
任务如下:
1)07/21/2003
2)2003 年 7 月 21 日
编写一个程序,以第一种格式读取日期并以第二种格式打印它。
我应该使用字符串方法,尤其是 strtok。
这是我的代码:
#include <stdio.h>
#include <string.h>
int main()
{
char date[20];
char month[20];
char day[20];
char year[20];
char *token;
char sep[1] = "/";
printf("Enter the date (MM/DD/YYYY): ");
gets(date);
token = strtok(date, sep);
if (token == "01")
{
strcpy(month, "Januray");
}
else if (token == "02")
{
strcpy(month, "February");
}
//continuing in this way
}
else if (token == "11")
{
strcpy(month, "November");
}
else
{
strcpy(month, "December");
}
token = strtok(NULL, sep);
strcpy(day, token);
token = strtok(NULL, sep);
strcpy(year, token);
printf("%s %s, %s", month, day, year);
}
问题是月份部分总是给出十二月,这意味着 if 语句不起作用。
这样写
if (token == "01")
没有按照您的想法去做,token
指向字符串的开头(日期),因此您正在相互比较两个地址,而不是使用 strcmp( ).
if (strcmp(token,"01") == 0)
但是上面的方法有点容易出错,如果用户输入的是“1”怎么办?所以更好的方法是将其转换为整数:
char* tokenend = NULL;
int mon = strtol(token, &tokenend, 10);
然后你可以在 switch 中使用 mon
,这样代码就不会那么冗长了。
switch(mon) {
case 1:
strcpy(month,"January");
break;
...
default:
fprintf(stderr, "Invalid month entered %s", token);
break;
}
另请注意,strtok
更改了 date
的内容,因此原始日期已不复存在。如果要保留原始字符串,则需要单独存储。
一般来说,当从键盘读取字符串时,您应该使用 fgets
而不是 gets
,因为 gets
不限制它可以读取的字符数
if (fgets(date, sizeof(date), stdin) != NULL)
{
// and remove the \n
char* p = strchr(date,'\n');
if (p != NULL) *p = '[=14=]';
}
任务如下: 1)07/21/2003 2)2003 年 7 月 21 日
编写一个程序,以第一种格式读取日期并以第二种格式打印它。
我应该使用字符串方法,尤其是 strtok。
这是我的代码:
#include <stdio.h>
#include <string.h>
int main()
{
char date[20];
char month[20];
char day[20];
char year[20];
char *token;
char sep[1] = "/";
printf("Enter the date (MM/DD/YYYY): ");
gets(date);
token = strtok(date, sep);
if (token == "01")
{
strcpy(month, "Januray");
}
else if (token == "02")
{
strcpy(month, "February");
}
//continuing in this way
}
else if (token == "11")
{
strcpy(month, "November");
}
else
{
strcpy(month, "December");
}
token = strtok(NULL, sep);
strcpy(day, token);
token = strtok(NULL, sep);
strcpy(year, token);
printf("%s %s, %s", month, day, year);
}
问题是月份部分总是给出十二月,这意味着 if 语句不起作用。
这样写
if (token == "01")
没有按照您的想法去做,token
指向字符串的开头(日期),因此您正在相互比较两个地址,而不是使用 strcmp( ).
if (strcmp(token,"01") == 0)
但是上面的方法有点容易出错,如果用户输入的是“1”怎么办?所以更好的方法是将其转换为整数:
char* tokenend = NULL;
int mon = strtol(token, &tokenend, 10);
然后你可以在 switch 中使用 mon
,这样代码就不会那么冗长了。
switch(mon) {
case 1:
strcpy(month,"January");
break;
...
default:
fprintf(stderr, "Invalid month entered %s", token);
break;
}
另请注意,strtok
更改了 date
的内容,因此原始日期已不复存在。如果要保留原始字符串,则需要单独存储。
一般来说,当从键盘读取字符串时,您应该使用 fgets
而不是 gets
,因为 gets
不限制它可以读取的字符数
if (fgets(date, sizeof(date), stdin) != NULL)
{
// and remove the \n
char* p = strchr(date,'\n');
if (p != NULL) *p = '[=14=]';
}