【问题标题】:How to read only the last 3 digits?如何只读取最后 3 位数字?
【发布时间】:2012-12-20 00:14:06
【问题描述】:

我只想从stdin 获取最后三件事。

使用

scanf("%3d")

我可以得到前 3 个,但我想要最后 3 个,并且忽略它之前的所有内容。

示例输入

bkjashfsjak32326321536999999999999999999999999999999999999999999

我该怎么做?

如果可能的话,我想忽略 stdin 上的内容并在缓冲区中只获取 3 个字符。

【问题讨论】:

    标签: c string scanf


    【解决方案1】:

    看起来您正在读取一个整数。如果是这样(因为您忽略了其他所有内容),您可以阅读整个内容并在除以 1000 时取余数。

        scanf ("%d", &read_int);
        last_3 = read_int % 1000;
    

    更新: 因为它不是一个整数(假设some_large_buf 可以取你最大的字符串):

        scanf ("%s", some_large_buf);
        last_3 = atoi (some_large_buf + strlen(some_large_buf) - 3);
    

    更新 2: 此版本不使用缓冲区,它保持最低有效 3 位的滚动值。

        unsigned int sum = 0;
        char c;
        while (1) {
            scanf ("%c", &c);
    
            if (c == 0 || c == '\n') break;
    
            if (c >= '0' && c <= '9') {
                sum *= 10; 
                sum += c - '0';
                sum %= 1000;
            }   
            else {
                sum = 0;
            }   
        }   
        printf ("%d", sum);
    

    【讨论】:

    • 不适用于9*9H#2hd2poh2pthpo2hr2hpo9999999999999999999999999999999999999999999999999999
    • 这行得通,但是阅读时有没有办法忽略?所以它可以放入buffer[4]
    【解决方案2】:

    一种可能性是使用fgets( ... stdin) 将其读入缓冲区。然后您可以从缓冲区的末尾提取所需的信息(例如,使用sscanf 并将指针传递到所需的起始位置)。总体思路如下。请注意,fgets 可以在返回的缓冲区中返回换行符,因此如果知道它会在那里,则需要考虑它。

    char buf[1024];
    char *pos;
    size_t len;
    int val = 0;
    
    fgets( buf, sizeof( buf ), stdin );
    len = strlen( buf );
    
    if ( len < 3 )
      printf( "Not long enough\n" );
    else
      sscanf( buf + len - 3, "%d", &val );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多