我想从stdin
获得最后3件事。
使用
scanf("%3d")
我可以获得前3个,但我想要最后3个,并忽略它之前的所有内容。
示例输入
bkjashfsjak32326321536999999999999999999999999999999999999999999
我该怎么做?
如果可能,我想忽略stdin
上的内容,并在缓冲区上只获得3个字符。
答案 0 :(得分: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);
答案 1 :(得分: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 );