如何在C中标记一个字符数组到不同的int ?

  • 本文关键字:数组 字符 一个 int c
  • 更新时间 :
  • 英文 :


我不熟悉C,我很沮丧。我需要从char数组令牌创建3个int变量。这应该是一个日期mm/dd/yyyy。我的3个int变量是:

int monthNum; 
int dayNum;  
int yearNum;
void handlePrint() { 
char token[MAX_COMMAND_TOKEN_LENGTH]; // Placeholder for the first argument
int weekDays = 7;
int numDays = 31;
if (getCommandWord(token, MAX_COMMAND_TOKEN_LENGTH) != 'n') {
printf("Too many arguments for print command! It must be in the form of print MM/DD/YYYY.n");
while (getCommandWord(token, MAX_COMMAND_TOKEN_LENGTH) != 'n');
return;
}
printf("printing the weeks of month %snn", token);
}

我尝试通过执行以下操作来标记令牌:

char* endPoint = "/";
long int monthN = strtol (token, &endPoint, 10);

获取第一个变量,我如何创建另外两个变量?

我真的很感激你的帮助!

继续我上面的评论,假设您正在分离日期,如果token作为getCommandWord(token, MAX_COMMAND_TOKEN_LENGTH) != 'n')的字符串返回,那么简单地将token传递给sscanf()是分离月,日和年值的简单方法。您可以简单地执行:

if (sscanf (token, "%2d/%2d/%4d", &monthNum, &dayNum, &yearNum) != 3) { 
fputs ("error: invalid token format.n", stderr);
return 1;
}

这将把monthNum,dayNumyearNum分离成整数值,但您仍然需要验证monthNum1 - 12,dayNum1 - 31(至少),然后可选地将yearNum处理为1位数,2位数或4位数的值。这在很大程度上可以按照你喜欢的方式处理;例如,如果年份小于21,则假设当前世纪并添加2000,如果年份大于21且小于100,则添加1900,等等。这完全取决于你。

在提示用户输入日期之后,一个实现上述逻辑的快速示例可以像下面这样做。fgets()用于输入,因为您的代码中没有给出getCommandWord():
#include <stdio.h>
#define MAXC 256        /* if you need a constant, #define one (or more) */
int main (void) {

char input[MAXC];
int m, d, y;

fputs ("enter date (mm/dd/yyyy): ", stdout);                /* prompt */
if (fgets (input, MAXC, stdin) == NULL) {                   /* read/validate input */
puts ("(user canceled input)");
return 0;
}
if (sscanf (input, "%2d/%2d/%4d", &m, &d, &y) != 3) {       /* separate int m, d, y */
fputs ("error: invalid input format.n", stderr);
return 1;
}
/* validation of m, d, y values */
if (m < 1 || 12 < m) {                                      /* check month 1-12 */
fputs ("error: invalid month value.n", stdout);
return 1;
}
if (d < 1 || 31 < d) {                                      /* check day 1-31 */
fputs ("error: invalid date value.n", stdout);
return 1;
}
/* adjust 2-digit day, 0-21 year 2000, 22-99 year 1900  */
if (y <= 21)
y += 2000;
else if (y < 100)
y += 1900;

printf ("month : %dnday   : %dnyear  : %dn", m, d, y);
}

这只是一个简单的例子,你可以,也应该调整年份处理和添加任何额外的验证来满足你的需求。

使用/输出示例

全位数

$ ./bin/split_date
enter date (mm/dd/yyyy): 12/21/1967
month : 12
day   : 21
year  : 1967

单位数月/日,大于21的2位数年:

$ ./bin/split_date
enter date (mm/dd/yyyy): 1/2/67
month : 1
day   : 2
year  : 1967

小于或等于21的2位数年份:

$ ./bin/split_date
enter date (mm/dd/yyyy): 2/11/21
month : 2
day   : 11
year  : 2021

无效月:

$ ./bin/split_date
enter date (mm/dd/yyyy): 13/11/21
error: invalid month value.

请过目一遍,如果还有问题请告诉我。

非常感谢你,这对我帮助很大!如果我需要做同样的事情,但是在同一行中有两个标记,中间用空格分隔(mm/dd/yyyy mm/dd/yyyy),我该怎么做呢?

char token1[MAX_COMMAND_TOKEN_LENGTH]; //1st arg (from date) 
char token2[MAX_COMMAND_TOKEN_LENGTH]; //2nd arg (to date) 
int month1, month2; 
int day1, day2; 
int year1, year2; 

还是同样的情况,但是现在我需要打印6个不同的int变量,因为我有两个日期。

最新更新