Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中实现这个分隔符?_C - Fatal编程技术网

如何在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啊!是的,在非-%地区[将被视为[