鱼C论坛

 找回密码
 立即注册
查看: 1268|回复: 8

[已解决]C语言如何实现只有输入##才退出输入呢(输入enter不退出)

[复制链接]
发表于 2021-1-23 07:30:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
部分程序:
void BUILD_E()
{
FILE *fp;
char name[10],text[10000000];
char way[10] = "e:\\";//设置路径为e盘
printf("请输入文件名称:\n");
scanf("%s",name);
strcat(name,".txt");//给文件名加上后缀
strcat(way,name);//添加路径
fp = fopen(way,"w");
printf("请输入内容:\n");
while((text = getchar()) && text != '#''#')//只有输入##号时才退出输入
{
scanf("%s",text);
fputs(text,fp);
}
fclose(fp);
}
最佳答案
2021-1-23 11:41:51
本帖最后由 jackz007 于 2021-1-23 11:44 编辑

        看似简单的要求,实现起来还是挺麻烦的
void BUILD_E(void)
{
        FILE * fp                                         ;
        char name[10] , text[1024]                        ;
        char way[10] = "e:\"                             ; // 设置路径为e 盘
        char c[2]                                         ;
        int i , n                                         ;
        printf("请输入文件名称:")                        ;
        scanf("%s" , name)                                ;
        strcat(name , ".txt")                             ; // 给文件名加上后缀
        strcat(way , name)                                ; // 添加路径
        fp = fopen(way , "w")                             ;
        printf("请输入内容:\n")                          ;
        fflush(stdin)                                     ; // 清除 scanf() 遗留在键盘缓冲区内的换行符 '\n',否则,会给后续 getchar() 的文本输入带来麻烦
        for(i = n = 0 ; ;) {
                c[i] = getchar()                          ;
                if(c[i] != '#') {
                        if(c[i] == '\n') {
                                if(i) text[n ++] = c[0]   ;
                                text[n ++] = c[i]         ;
                                text[n ++] = '\0'         ;
                                fputs(text , fp)          ;
                                i = 0                     ;
                                n = 0                     ;
                        } else {
                                if(i) {
                                        text[n ++] = c[0] ;
                                        text[n ++] = c[i] ;
                                        i = 0             ;
                                } else {
                                        text[n ++] = c[i] ;
                                }
                        }
                } else {
                        if(i) {
                                if(n) {
                                        text[n ++] = '\0' ;
                                        fputs(text , fp)  ;
                                }
                                break                     ;
                        }
                        i ++                              ;
                }
        }
        fclose(fp)                                        ;
}

四个报错都是这一排的,删除这一排就是输入enter就会结束

四个报错都是这一排的,删除这一排就是输入enter就会结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-23 11:41:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-23 11:44 编辑

        看似简单的要求,实现起来还是挺麻烦的
void BUILD_E(void)
{
        FILE * fp                                         ;
        char name[10] , text[1024]                        ;
        char way[10] = "e:\"                             ; // 设置路径为e 盘
        char c[2]                                         ;
        int i , n                                         ;
        printf("请输入文件名称:")                        ;
        scanf("%s" , name)                                ;
        strcat(name , ".txt")                             ; // 给文件名加上后缀
        strcat(way , name)                                ; // 添加路径
        fp = fopen(way , "w")                             ;
        printf("请输入内容:\n")                          ;
        fflush(stdin)                                     ; // 清除 scanf() 遗留在键盘缓冲区内的换行符 '\n',否则,会给后续 getchar() 的文本输入带来麻烦
        for(i = n = 0 ; ;) {
                c[i] = getchar()                          ;
                if(c[i] != '#') {
                        if(c[i] == '\n') {
                                if(i) text[n ++] = c[0]   ;
                                text[n ++] = c[i]         ;
                                text[n ++] = '\0'         ;
                                fputs(text , fp)          ;
                                i = 0                     ;
                                n = 0                     ;
                        } else {
                                if(i) {
                                        text[n ++] = c[0] ;
                                        text[n ++] = c[i] ;
                                        i = 0             ;
                                } else {
                                        text[n ++] = c[i] ;
                                }
                        }
                } else {
                        if(i) {
                                if(n) {
                                        text[n ++] = '\0' ;
                                        fputs(text , fp)  ;
                                }
                                break                     ;
                        }
                        i ++                              ;
                }
        }
        fclose(fp)                                        ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-23 12:11:25 | 显示全部楼层
jackz007 发表于 2021-1-23 11:41
看似简单的要求,实现起来还是挺麻烦的

谢谢大佬!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-23 12:16:58 | 显示全部楼层
void BUILD_E()
{
    FILE *fp;
    char name[10],text[10000000];
    char way[10] = "e:\";//设置路径为e盘
    printf("请输入文件名称:\n");
    scanf("%s",name);
    strcat(name,".txt");//给文件名加上后缀
    strcat(way,name);//添加路径
    fp = fopen(way,"w");
    printf("请输入内容:\n");
    while(1)
    {
        scanf("%s",text);
        //printf("%s",text);
        if(!strcmp(text,"##"))//只有单纯输入##然后回车才会跳出循环结束输入,若输入的##后面还有其他内容,则不会结束输入
            break;
        else
            fputs(text,fp);
    }
    fclose(fp);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-23 12:38:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-23 13:49:33 | 显示全部楼层
jackz007 发表于 2021-1-23 11:41
看似简单的要求,实现起来还是挺麻烦的

大佬,19到21步没看懂,能解释一下这几步的作用嘛
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-23 14:01:35 | 显示全部楼层
guhusf 发表于 2021-1-23 13:49
大佬,19到21步没看懂,能解释一下这几步的作用嘛

从16行开始说吧
如果输入的是##,那么就会满足if条件,执行 if 语句块,即执行break,跳出while循环;
如果输入的不是##,那么不满足if条件,执行else语句块,即执行fputs,将输入内容写入文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-23 14:25:30 | 显示全部楼层
sunrise085 发表于 2021-1-23 14:01
从16行开始说吧
如果输入的是##,那么就会满足if条件,执行 if 语句块,即执行break,跳出while循环;
...

大佬,我测试了你的程序,发现我输入的空格和换行都被忽略了。这是为什么呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-23 14:45:08 | 显示全部楼层
guhusf 发表于 2021-1-23 14:25
大佬,我测试了你的程序,发现我输入的空格和换行都被忽略了。这是为什么呢

哦哦因为用的是scanf
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 08:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表