linux vi下ctrl+D到底是什么功能,能从字符串删除单字节?

#include <head.h>

int main(int argc, const char *argv[])
{
char buf[1024];

do{
fgets(buf,sizeof(buf),stdin);

buf[strlen(buf) - 1] = '\0';

printf("output:%s.\n",buf);
}while(buf[0] != '\0');
return 0;
}
./a.out后输入123456
回车后按ctrl+d
就变成12345
依次递减直到退出

跟vi没关系

stty -a 可以看到
eof = ^D
fgets函数的调用形式如下:fgets(str,n,fp);此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。
sizeof(buf) 一直就是1024,循环中没把buf置零
循环执行buf[strlen(buf) - 1] = '\0';每次把最后一个字符置零
所以就会出现你的结果追问

我觉得应该不是循环的结果吧,do while循环本质上只起到了一个判断的作用。
运行./a.out后,123456回车,输出output :123456.
(程序还没有退出)再输入回车,程序就退出。

而主要困惑是,当输出output :123456 时,再按ctrl+d,就变成
output :12345 ,那个6是怎么被吃掉的 ,貌似与buf-1有关,可这样想讲不通啊

追答

Ctrl+D 只是相当于输入了EOF

第一次fgets后buf内容”123456\n“,千万别忘了最后的换行符\n(16进制为0A)
然后buf[strlen(buf) - 1] = '\0',buf内容为”123456“,最后的换行符清掉了
第二次fgets,因为只读入了EOF,所以什么都没读到(跟换行符不同,直接回车能读到换行符),
buf内容仍为“123456”
然后buf[strlen(buf) - 1] = '\0',buf内容为”12345“,最后的‘6’清掉了
。。。
你在fgets后面加上调试语句就能看出来了,最好是设置断点,查看变量内容

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-09-21
当你在编辑一个文件时想返回终端进行一些操作。比如查看谁在线。可以在vi的命令模式输入:sh 执行完操作后按ctrl+d 就可以返回vi 继续编辑
相似回答