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=]';
}