如何在C中实现这个分隔符?
假设我将以这种方式输入数据如何在C中实现这个分隔符?,c,C,假设我将以这种方式输入数据 18-MAR-1995 现在我想用一个scanf函数将这个数据存储到不同的变量中 假设变量是 int dd,yy; char month[3]; 18将存储在dd变量中 MAR将存储在月变量中 1995将存储在yy变量中 我试过这个 scanf("%d[^-]%s[^-]%d",&dd,s,&yy); 注意scanf语法不同于正则表达式;看来你把这两个搞混了。非特殊字符匹配自身,因此-无需特殊处理。此外,%s始终需要一个以空格结尾的字符串字,因此
18-MAR-1995
现在我想用一个scanf函数将这个数据存储到不同的变量中
假设变量是
int dd,yy;
char month[3];
18将存储在dd变量中
MAR将存储在月变量中
1995将存储在yy变量中
我试过这个
scanf("%d[^-]%s[^-]%d",&dd,s,&yy);
注意scanf语法不同于正则表达式;看来你把这两个搞混了。非特殊字符匹配自身,因此-无需特殊处理。此外,%s始终需要一个以空格结尾的字符串字,因此您需要%3c来精确匹配三个字符
因此,正确的格式字符串是:
scanf("%d-%3c-%d", &dd, month, &yy);
请注意,不会将终止'\0'字节添加到月份!因此,这是一种定义良好的行为,但不要试图将month用作以null结尾的字符串。请注意,scanf语法与正则表达式不同;看来你把这两个搞混了。非特殊字符匹配自身,因此-无需特殊处理。此外,%s始终需要一个以空格结尾的字符串字,因此您需要%3c来精确匹配三个字符
因此,正确的格式字符串是:
scanf("%d-%3c-%d", &dd, month, &yy);
请注意,不会将终止'\0'字节添加到月份!因此,这是一种定义良好的行为,但不要尝试将month用作以null结尾的字符串。代码的问题在于使用了[^-],这意味着当您看到[^-]时停止。您只想匹配-。 所以这是错误的。 试试这个
scanf("%d-%[^-]-%d", &d, m, &y);
在这里,您将在找到-时停止对%d的分析,并在找到下一个-时停止该字符串。最后一个整数变成y
正如StoryTeller提到的,如果您想将MAR作为字符串处理,则需要4个字符来存储MAR
这里有一个你的代码的问题是你使用了[^-],这意味着当你看到[^-]字面意思时停止。您只想匹配-。 所以这是错误的。 试试这个
scanf("%d-%[^-]-%d", &d, m, &y);
在这里,您将在找到-时停止对%d的分析,并在找到下一个-时停止该字符串。最后一个整数变成y
正如StoryTeller提到的,如果您想将MAR作为字符串处理,则需要4个字符来存储MAR
这里有一个试试这个:
//格式为dd mmm yyyy格式,例如1995年3月18日
int dd,yy;
char month[4]; // note the extra char for null char at end.
char* sz = "18-MAR-1995";
if (sscanf(sz, "%d-%3s-%4d", &dd, month, &yy) != 3)
{
// sz is not in expected format
}
试试这个:
//格式为dd mmm yyyy格式,例如1995年3月18日
int dd,yy;
char month[4]; // note the extra char for null char at end.
char* sz = "18-MAR-1995";
if (sscanf(sz, "%d-%3s-%4d", &dd, month, &yy) != 3)
{
// sz is not in expected format
}
3个字符的月份需要4个字符的缓冲区这有什么问题?您尝试了scanf%d[^-]%s[^-]%d、&dd、s和yy,发生了什么事?@StoryTeller您可能仍然能够在char month[3]变量@PritamKarmakar中存储3字节的数据,而不是scanf和%s。RTFM,因为您的程序中有UB。3个字符的月份需要4个字符的缓冲区。这有什么问题吗?您尝试了scanf%d[^-]%s[^-]%d、&dd、s、&yy,然后发生了什么事?@StoryTeller您仍然可以在char month[3]变量@pritamkarkar中存储3字节的数据,而不是scanf和%s。RTFM,因为您的程序中有UB。可能值得一提的是如何使用null终止month。@Dan:由于分配的存储太少,无法使用null终止3个字符的数组。如果分配了至少4个字节的存储空间,则使用%3[^-]作为扫描集是合理的。这将以null结尾字符串。您也可以只使用%3s。可能值得一提的是如何使用null终止month。@Dan:由于分配的存储太少,无法使用null终止3个字符的数组。如果分配了至少4个字节的存储空间,则使用%3[^-]作为扫描集是合理的。这将以null结尾字符串。您也可以只使用%3s。实际上,[在OP的代码中]意味着匹配输入中的[字符,而不是%[您看起来是]describing@M.M啊!是的,在非-%区域中,[在OP的代码中被视为[实际上]意味着匹配输入中的[字符,而不是%你似乎是describing@M.M啊!是的,在非-%地区[将被视为[