while((c=getchar())!='\n')

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了while((c=getchar())!='\n')相关的知识,希望对你有一定的参考价值。

谁能详细介绍一下这个东西 我刚学C语言 谢谢了
/*每个getchar()依次一个一个读入字符直到回车出现*/
我看不懂 谁能详细介绍下

(c=getchar())!=' ')如果c的值不等于空格,执行while循环 ,不断把键盘的值存给c,当从键盘输入的值是空格,c的值就是空格的ASCII码值,此时while循环终止,不再从键盘取得字符赋给c。

相当于: 

从键盘输入一个字符 :getchar()

然后把字符的值赋给c :c=getchar()

然后判断c是否等于‘ ’ ,' '代表空格。

扩展资料:

用法注意事项

利用while循环和getchar()读取缓存中的数据时,在while(c = getchar() != ‘\\n’)这个语句中,由于运算符的优先级不同,我们先执行“!=”这个判断,在判断结束之后,程序返回0或者1,将其赋值给c。

在ascii码表中,1代表的图案就是笑脸,发现这个优先级顺序的问题也是由于我打印了每一次while语句之后的所有c的值。 

而在这个语句中,由于括号有最高的优先级,我们必定先执行括号中的内容,再去判断c是否等于回车,这样肯定已经是吧我们想要的值复制给了c。

参考技术A 执行 c=getchar()(输入一个字符) 判断是否 为 '\n'(换行的意思,也就是一个回车)
c=getchar())!='\n' 输入字符不等于换行
如果输入的是回车那就跳出循环本回答被提问者采纳
参考技术B while条件表达式getchar()!='\n'只要输入的字符不是回车,就一直执行循环,而循环内是一个空语句,所以按回车键程序才能继续执行

为啥 (while .. getchar()) 不会在 C 中写入我的文件?

【中文标题】为啥 (while .. getchar()) 不会在 C 中写入我的文件?【英文标题】:Why does (while .. getchar()) does not write to my file, in C?为什么 (while .. getchar()) 不会在 C 中写入我的文件? 【发布时间】:2021-05-30 00:15:38 【问题描述】:

我需要编写一个程序,要求用户输入字符串,每个字符串在用户按下“Enter”时结束。

程序需要接收文件名作为参数,每次操作都应打开和关闭文件,并且对于输入的每个字符串,程序应将字符串附加到文件末尾(在新行上)。

这是我目前的代码:

 int is_file_exists(char *file_name)

    
    FILE *file;
    if ((file = fopen(file_name,"r"))!=NULL)    
        
            /* file exists */
            fclose(file);
            return 1;
            
    else  
        
            //File not found, no memory leak since 'file' == NULL
            //fclose(file) would cause an error
            return 0;
        
        


int main(int argc, char **argv)

    char c;
    FILE *file;

    if (argc >= 2)
    
         if (is_file_exists(argv[1]))
         
             file = fopen(argv[1], "w");
         
         else
         
             return 0;
         
    
    else
    
         file = fopen("file.txt", "w");
    

    while ((c = getchar()) != EOF)
    
        putc(c, file);
    

    return 0;

到目前为止,代码已编译并正在创建文件,但其中没有写入任何内容。

编辑:我还需要一些函数指针,请参阅我的 cmets on selected answer

【问题讨论】:

首先c 必须是int,因为EOFint。事实上,循环永远不会结束。其次,您是否退出程序,如果是,如何退出?我问是因为您没有关闭或刷新文件。如果您还没有退出程序或者如果您强制终止程序,它可能无法正确写入文件。 你检查过你终端当前位置file.txt的内容吗? @AntoninGAVREL 是的。我正在通过“ls”和“gedit”或“cat”重新检查。 @kaylum 我已将其更改为 int 但它仍然没有写入文件。我通过 CTRL+Z 退出程序,稍后我需要添加一个特殊的“exit”输入,如果键入它将终止程序。 在 Linux 上? ctrl-z 暂停程序。尝试 ctrl-d 发送 EOF。 【参考方案1】:

我认为其中一个问题是您正在打开和关闭一个文件,然后又重新打开它。最好只使用指针将其保持打开状态,同时测试打开文件是否没有问题。另一个问题是您在文件中写入,您不喜欢将文本附加到它吗?好吧,这是你的决定。至于代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h> // exit

typedef struct mystruct 
    char *exit_word;
    void (*exit_fptr)(int); // man exit
    int (*strcmp_fptr)(const char *, const char*); // man strcmp
              t_mystruct;

int is_file_exists(char *filename, FILE **file)

    return (*file = fopen(filename,"a")) > 0;


#define BUFF_SIZE 1024

int main(int argc, char **argv)

    char c;
    FILE *file;
    t_mystruct s = .exit_word = "-exit", .exit_fptr = &exit, .strcmp_fptr = &strcmp;

    if (argc >= 2) 
         if (!(is_file_exists(argv[1], &file)))
            return 0;
    
    else
         file = fopen("file.txt", "a"); // open the file in append mode

    char buffer[BUFF_SIZE];
    while (42) 
        int i = 0;
        memset(buffer, 0, BUFF_SIZE);
        while ((c = getchar()) != '\n')
            buffer[i++] = c;
        if (!s.strcmp_fptr(buffer,s.exit_word)) // exit if user type exit, allow you to fclose the file
            fclose(file);
            s.exit_fptr(EXIT_SUCCESS); // better to use the define
        
        buffer[i] = '\n';
        fputs(buffer, file);
    
    fclose(file);
    return 0;

【讨论】:

谢谢! 1. while(42) 只是为了让它永远运行,对吗?你也可以写while(1)等等? 2. 我实际上需要创建一个内部有 3 个定义的结构:string ("-exit") 和 2 function pointers。一个指针指向类似 strcmp 的 CMP 函数,该函数检查用户的输入是否与结构中的字符串 -exit 匹配。如果是这样,它将运行第二个函数指针,该指针将指向将退出程序的函数。你能帮我解决这个问题吗?或者这个帖子太多了? 是的,你可以使用 while(1) 或任何数字,当然让我编辑 这里memset的目的是什么?我可以用别的东西代替它吗? 将缓冲区重置为 0;您可以通过在其位置移动 char buffer[BUFF_SIZE] 来替换它 while ((c = getchar()) != '\n' &amp;&amp; i &lt; BUFF_SIZE)这一行,你这里不开块 ...... 为什么?【参考方案2】:

您的代码可以运行

记得在输入完成后按Ctrl+d。该文件将包含您预期的内容

您的代码等待 EOF 退出循环。 Ctrl+d 是输入EOF的一种方式,否则程序永远不会结束。 putc 将首先写入缓存,然后写入磁盘。这是文件系统的一种优化机制。您可以选择在打开文件时通过 DirectIO 避免这种情况。

程序正常终止后,文件会自动关闭,然后将缓存中的数据复制到磁盘;

但是当程序异常终止时,缓存中的数据可能会丢失。

文件应该关闭

需要关闭。 open 和 close 应该像 malloc 和 free 一样成对组织。

【讨论】:

以上是关于while((c=getchar())!='\n')的主要内容,如果未能解决你的问题,请参考以下文章

模板 - 快速输入输出

模板备份

hdu 2553 N皇后

模板 - 算法基础 - 输入输出

while((ch=getchar())!='\n')是啥意思

hdu 1312 Red and Black