1

我只想从stdin.

使用

scanf("%3d")

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

样本输入

bkjashfsjak32326321536999999999999999999999999999999999999999999

我怎样才能做到这一点?

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

4

2 回答 2

4

看起来您正在读取一个整数。如果是这样(因为您忽略了其他所有内容),您可以阅读整个内容并在除以 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);
于 2012-12-20T00:16:49.670 回答
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 );
于 2012-12-20T00:18:37.910 回答