|
发表于 2022-8-14 08:21:15
|
显示全部楼层
- (gdb) print *stdin
- $1 = {_flags = -72539512, _IO_read_ptr = 0x4052a2 "cd1234\n", _IO_read_end = 0x4052a9 "",
- _IO_read_base = 0x4052a0 "abcd1234\n", _IO_write_base = 0x4052a0 "abcd1234\n",
- _IO_write_ptr = 0x4052a0 "abcd1234\n", _IO_write_end = 0x4052a0 "abcd1234\n", _IO_buf_base = 0x4052a0 "abcd1234\n",
- _IO_buf_end = 0x4056a0 "", _IO_save_base = 0x0, _IO_backup_base = 0x0, _IO_save_end = 0x0, _markers = 0x0,
- _chain = 0x0, _fileno = 0, _flags2 = 0, _old_offset = -1, _cur_column = 0, _vtable_offset = 0 '\000',
- _shortbuf = "", _lock = 0x7ffff7e4e750 <_IO_stdfile_0_lock>, _offset = -1, _codecvt = 0x0,
- _wide_data = 0x7ffff7e4b7e0 <_IO_wide_data_0>, _freeres_list = 0x0, _freeres_buf = 0x0, __pad5 = 0, _mode = -1,
- _unused2 = '\000' <repeats 19 times>}
复制代码
- #include <stdio.h>
- int main(void) {
- // getchar函数把输入的一行字符存入stdin中的缓冲区
- // 然后返回第0个字符
- int ch = getchar();
- // 上面的getchar获取了第0个字符,这里读指针减1之后
- // 读指针指向的位置就是上面getchar返回的那个字符
- --stdin->_IO_read_ptr;
- // 这里验证一下上面说的,看看读指针的位置是不是和变量ch中的字符一样
- if(ch == stdin->_IO_read_ptr[0]) {
- for(char *p = stdin->_IO_read_ptr; p != stdin->_IO_read_end; ++p) {
- printf("'%c' ", *p);
- }
- puts("");
- }
- // 让读指针指向当前输入行的后面
- // 让之后使用stdin的函数去获取新的一行字符
- stdin->_IO_read_ptr = stdin->_IO_read_end;
- scanf("%c", (char *)&ch);
- // 再来一次
- --stdin->_IO_read_ptr;
- if(ch == stdin->_IO_read_ptr[0]) {
- for(char *p = stdin->_IO_read_ptr; p != stdin->_IO_read_end; ++p) {
- printf("'%c' ", *p);
- }
- puts("");
- }
- return 0;
- }
复制代码- $ gcc-debug -o main main.c
- $ ./main
- asdf1234
- 'a' 's' 'd' 'f' '1' '2' '3' '4' '
- '
- zxcv09876
- 'z' 'x' 'c' 'v' '0' '9' '8' '7' '6' '
- '
- $
复制代码
注意,stdin里面的这些变量是下划线开头的,下划线开头的名字是保留的,你不应该使用这些名字
上面的程序很有可能无法在你那边运行,因为这个程序假设stdin里面有_IO_read_ptr这些名字
但是stdin完全可以不是这个样子,stdin是什么样子,这取决于实现
|
|