scanf格式说明符只读取一个数字

时间:2015-01-28 02:48:21

标签: c++ c

说我的输入值是:

"2a", "6", "-20" "+20"

我想将以下值读入整数:

0, 6, -20, 20

我目前正在使用这行代码:

sscanf(input, "%d", &some_integer);

但它的内容是" 2a"具有2的整数值 - 我如何阅读" 2a"为0?

2 个答案:

答案 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;
}
  1. 使用sscanf()"%n"说明符来了解读取的字符数,并使指针继续读取。
  2. 使用strtol()将读取值转换为整数,当找到不可转换的第一个字符时转换停止,请注意base参数非常重要,因为2A是有效的十六进制数。
  3. 检查转换是否成功,如果转换的所有字符都满足*endptr == '\0'
  4. 将指针前进到源字符串,然后继续,直到不再剩下任何字符进行读取。
  5. 如果您只需要检查输入字符串是否为数字,那么就应该使用

    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" ) );
}