我不熟悉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
,dayNum
和yearNum
分离成整数值,但您仍然需要验证monthNum
是1 - 12
,dayNum
是1 - 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变量,因为我有两个日期。