说我的输入值是:
"2a", "6", "-20" "+20"
我想将以下值读入整数:
0, 6, -20, 20
我目前正在使用这行代码:
sscanf(input, "%d", &some_integer);
但它的内容是" 2a"具有2的整数值 - 我如何阅读" 2a"为0?
答案 0 :(得分:1)
你可以这样做
#include <stdlib.h>
#include <stdio.h>
int
main()
{
char text[100];
int value;
int count;
char *endptr;
char source[] = "2a 6 -20 +20";
char *input;
input = source;
while (sscanf(input, "%99s%n", text, &count) == 1)
{
value = strtol(text, &endptr, 10);
if (*endptr != '\0')
value = 0;
input += count;
printf("%d ", value);
}
printf("\n");
return 0;
}
sscanf()
和"%n"
说明符来了解读取的字符数,并使指针继续读取。strtol()
将读取值转换为整数,当找到不可转换的第一个字符时转换停止,请注意base
参数非常重要,因为2A
是有效的十六进制数。*endptr == '\0'
。如果您只需要检查输入字符串是否为数字,那么就应该使用
int isdecimal(const char *const text)
{
char *endptr;
if (input == NULL)
return 0;
/* the 10 is to indicate that the number is in decimal representation */
strtol(text, &endptr, 10);
return (*endptr == '\0')
}
如果你只想让价值为0
,如果它不可转换,那么这就足够了
int convert(const char *const input)
{
int value;
char *endptr;
value = strtol(input, &endptr, 10);
if (*endptr != '\0')
value = 0;
return value;
}
答案 1 :(得分:-1)
或者你可以这样做。 %n
转换说明符指示前面的任何转换消耗了多少个字符。在你的情况下它应该是整个字符串。
int convert( char *input )
{
int some_integer, n;
if ( sscanf( input, "%d%n", &some_integer, &n ) != 1 )
{
printf( "not a number (1)\n" );
return 0;
}
if ( n != strlen(input) )
{
printf( "not a number (2)\n" );
return 0;
}
return some_integer;
}
int main( void )
{
printf( "%d\n", convert( "2a" ) );
printf( "%d\n", convert( "+20" ) );
}