C从字符串中提取数字
我想使用sscanf从字符串中提取一个数字 数字介于“=”和“;”C从字符串中提取数字,c,C,我想使用sscanf从字符串中提取一个数字 数字介于“=”和“;” #包括 int main(){ 字符名[20]; int-id; sscanf(“tabid=12544787844;123”、“%[^=]=%d”、名称和id); printf(“name=%s id=%d\n”,name,id); 返回1; } 我得到了以下结果: name=tabid id=-34011444 sscanf的正则表达式有什么问题呢?12544787844不适合int,因为它大于int\u MAX(因此会出
#包括
int main(){
字符名[20];
int-id;
sscanf(“tabid=12544787844;123”、“%[^=]=%d”、名称和id);
printf(“name=%s id=%d\n”,name,id);
返回1;
}
我得到了以下结果:
name=tabid id=-34011444
sscanf的正则表达式有什么问题呢?
12544787844
不适合int
,因为它大于int\u MAX
(因此会出现溢出)。将long-long
与%lld
格式字符串一起使用。12544787844
不适合int
,因为它大于int\u MAX
(因此会出现溢出)。将long
与%lld
格式字符串一起使用。发布的代码包含一些问题,如问题注释中所述
建议的守则如下:
;123从不输入
#include <stdio.h> // sscanf(), sprintf()
#include <stdlib.h> // exit(), EXIT_FAILURE
#define MAX_NAME_LEN 20
int main( void )
{
char name[ MAX_NAME_LEN +1 ];
long long int id;
char format[20];
sprintf( format, "%%%d[^=]=%%lld", MAX_NAME_LEN );
int status = sscanf("tabid=12544787844;123", format, name, &id);
if( status != 2 )
{
fprintf( stderr, "sscanf failed to extract the two fields\n" );
exit( EXIT_FAILURE );
}
// implied else, sscanf successful
printf(" name = %s id=%lld\n", name ,id);
// by convention:
// returning 0 indicates success,
// returning 1 indicates a failure
return 0;
}
#包括//sscanf(),sprintf()
#包括//退出(),退出失败
#定义最大名称长度20
内部主(空)
{
字符名[MAX_name_LEN+1];
长整型id;
字符格式[20];
sprintf(格式,“%%%d[^=]”=%%%lld”,最大名称长度);
int status=sscanf(“tabid=12544787844;123”,格式、名称和id);
如果(状态!=2)
{
fprintf(stderr,“sscanf未能提取这两个字段\n”);
退出(退出失败);
}
//否则,sscanf将成功
printf(“name=%s id=%lld\n”,name,id);
//按惯例:
//返回0表示成功,
//返回1表示失败
返回0;
}
发布的代码包含一些问题,如问题注释所述
建议的守则如下:
;123从不输入
#include <stdio.h> // sscanf(), sprintf()
#include <stdlib.h> // exit(), EXIT_FAILURE
#define MAX_NAME_LEN 20
int main( void )
{
char name[ MAX_NAME_LEN +1 ];
long long int id;
char format[20];
sprintf( format, "%%%d[^=]=%%lld", MAX_NAME_LEN );
int status = sscanf("tabid=12544787844;123", format, name, &id);
if( status != 2 )
{
fprintf( stderr, "sscanf failed to extract the two fields\n" );
exit( EXIT_FAILURE );
}
// implied else, sscanf successful
printf(" name = %s id=%lld\n", name ,id);
// by convention:
// returning 0 indicates success,
// returning 1 indicates a failure
return 0;
}
#包括//sscanf(),sprintf()
#包括//退出(),退出失败
#定义最大名称长度20
内部主(空)
{
字符名[MAX_name_LEN+1];
长整型id;
字符格式[20];
sprintf(格式,“%%%d[^=]”=%%%lld”,最大名称长度);
int status=sscanf(“tabid=12544787844;123”,格式、名称和id);
如果(状态!=2)
{
fprintf(stderr,“sscanf未能提取这两个字段\n”);
退出(退出失败);
}
//否则,sscanf将成功
printf(“name=%s id=%lld\n”,name,id);
//按惯例:
//返回0表示成功,
//返回1表示失败
返回0;
}
12亿美元。不适合4字节仅用于记录:scanf()
格式字符串不是正则表达式。我假设在您的最终代码中,输入不会被硬编码,因此%[^=]
是一个等待利用的缓冲区溢出-使用%19[^=]
。我会一起删除sscanf
,自己解析字符串并使用将字符串转换为数字。12 bln。不适合4字节仅用于记录:scanf()
格式字符串不是正则表达式。我假设在您的最终代码中,输入不会被硬编码,因此%[^=]
是一个等待利用的缓冲区溢出-使用%19[^=]
。我会一起删除sscanf
,我自己解析字符串并使用将字符串转换为数字。顺便说一句,这是不使用scanf()
的众多原因之一:无法可靠地检测到这一点。但这超出了这里的范围,所以,回答得好。@Dan我将变量类型更改为long-long,但我无法获得正确的数字值@Anis_堆栈,因为您还需要将格式字符串更改为“%[^=]=%lld”
,并在printf
中(“name=%s id=%lld\n”
)。这是一开始不使用scanf()
的众多原因之一:无法可靠地检测到这一点。但这超出了这里的范围,所以,回答得好。@Dan我将变量类型更改为long-long,但我无法获得正确的数字值@Anis_堆栈,因为您还需要将格式字符串更改为“%[^=]=%lld”
并且也更改为printf
(“name=%s id=%lld\n”
)。