在C语言中检测新行

在C语言中检测新行,c,C,我的代码是这样的: char k[1000]; while(1){ scanf("%s",&k); if(k[0] == '\n'){ exit(0);} /* Do some processing on k */ memset(k,0,1000); } int next_char = getcgar(); if (next_char == EOF){ your_eof_process(); } else if (nexr_char == '\n'){

我的代码是这样的:

char k[1000];
while(1){
scanf("%s",&k);
    if(k[0] == '\n'){
    exit(0);}
/* Do some processing on k */
memset(k,0,1000);
}
int next_char = getcgar();
if (next_char == EOF){
    your_eof_process();
}
else if (nexr_char == '\n'){
    your_newline_process();
}
char k[1000];
while(fgets(k, 1000, stdin)){
    if(k[0] == '\n'){
        exit(0);
    }
    /* Do some processing on k */
    memset(k,0,1000);
}
我的意图是按照正常方式处理用户输入,并在用户输入空字符串或新行时终止。这似乎不起作用

你们能帮我解决什么问题吗

请注意,如果它是文件的结尾,我还想终止,我应该如何为EoF执行该操作


提前感谢您提供的所有帮助。

这一款保证为您提供除换行(和EOF)之外的一切:


当它返回时,下一个字符保证要么是换行符,要么根本不存在(达到EOF)。这样做:

char k[1000];
while(1){
scanf("%s",&k);
    if(k[0] == '\n'){
    exit(0);}
/* Do some processing on k */
memset(k,0,1000);
}
int next_char = getcgar();
if (next_char == EOF){
    your_eof_process();
}
else if (nexr_char == '\n'){
    your_newline_process();
}
char k[1000];
while(fgets(k, 1000, stdin)){
    if(k[0] == '\n'){
        exit(0);
    }
    /* Do some processing on k */
    memset(k,0,1000);
}

就我个人而言,我只会使用
getchar()

chark[1000];
int ind,tempc;
对于(ind=0;ind
这一款保证为您提供除换行符(和EOF)之外的一切:


当它返回时,下一个字符保证要么是换行符,要么根本不存在(达到EOF)。这样做:

char k[1000];
while(1){
scanf("%s",&k);
    if(k[0] == '\n'){
    exit(0);}
/* Do some processing on k */
memset(k,0,1000);
}
int next_char = getcgar();
if (next_char == EOF){
    your_eof_process();
}
else if (nexr_char == '\n'){
    your_newline_process();
}
char k[1000];
while(fgets(k, 1000, stdin)){
    if(k[0] == '\n'){
        exit(0);
    }
    /* Do some processing on k */
    memset(k,0,1000);
}

就我个人而言,我只会使用
getchar()

chark[1000];
int ind,tempc;
对于(ind=0;ind
首先--不要使用
scanf
进行用户输入。这是一个充满微妙问题的雷区,正等待着新的C程序员来解决,而不是使用面向行的输入函数,如
fgets
或POSIX
getline
。每次都会读取(包括)尾随的
'\n'
(只要您为
fgets
提供足够大小的缓冲区,否则它只会继续读取其缓冲区大小的字符块,直到遇到
'\n'
EOF

因此,要读取用户输入直到遇到空字符串或
EOF
,只需执行以下操作:

#include <stdio.h>
#include <string.h>

#define MAXC 1000

int main (void) {

    char k[MAXC] = "";

    for (;;) {                          /* loop until empty-string of EOF */
        printf ("input: ");             /* prompt for input */
        if (fgets (k, MAXC, stdin)) {   /* read line (MAXC chars max) */
            if (*k == '\n') {           /* test for empty-string */
                fprintf (stderr, "empty-string! bye.\n");
                break;
            }
            size_t l = strlen (k);      /* get length of string */
            if (l && k[l - 1] == '\n')  /* check if last char is '\n' */
                k[--l] = 0;             /* overwrite with nul-terminator */
            printf ("got input: %s\n", k);
        }
        else {  /* got EOF */
            fprintf (stderr, "EOF -- bye.\n");
            break;
        }
    }

    return 0;
}
注意:对于Linux Ctrl+d生成
EOF
,我正好在上面的windoze上)

首先——不要使用
scanf
进行用户输入。这是一个充满微妙问题的雷区,正等待着新的C程序员来解决,而不是使用面向行的输入函数,如
fgets
或POSIX
getline
。每次都会读取(包括)尾随的
'\n'
(只要您为
fgets
提供足够大小的缓冲区,否则它只会继续读取其缓冲区大小的字符块,直到遇到
'\n'
EOF

因此,要读取用户输入直到遇到空字符串或
EOF
,只需执行以下操作:

#include <stdio.h>
#include <string.h>

#define MAXC 1000

int main (void) {

    char k[MAXC] = "";

    for (;;) {                          /* loop until empty-string of EOF */
        printf ("input: ");             /* prompt for input */
        if (fgets (k, MAXC, stdin)) {   /* read line (MAXC chars max) */
            if (*k == '\n') {           /* test for empty-string */
                fprintf (stderr, "empty-string! bye.\n");
                break;
            }
            size_t l = strlen (k);      /* get length of string */
            if (l && k[l - 1] == '\n')  /* check if last char is '\n' */
                k[--l] = 0;             /* overwrite with nul-terminator */
            printf ("got input: %s\n", k);
        }
        else {  /* got EOF */
            fprintf (stderr, "EOF -- bye.\n");
            break;
        }
    }

    return 0;
}

注意:对于Linux,Ctrl+d生成
EOF
,我正好在上面的windoze上)

与以往任何时候一样,这里的问题是
scanf()的使用不当。
scanf()
不用于读取输入,而是用于解析输入,格式字符串告诉它如何解析

在您的例子中,
%s
正在查找一系列非空白字符(IOW,一个单词),它会跳过任何前导空白
\n
(换行符)只是一个空白字符,因此它总是被跳过--您的
scanf()
将等待更多输入,直到它能够解析
%s

有关
scanf()
陷阱的更多信息,我向您推荐我的。根据经验,使用交互式输入(默认设置),
scanf()
几乎总是错误的

scanf(“%s”,…)
还有一个巨大的问题:只要输入包含非空白字符,它就会很高兴地溢出您提供的任何缓冲区,就像
get()
一样,它甚至因为这个原因而从C中删除:缓冲区溢出是极其危险的!因此,在您的情况下,请始终使用字段宽度
scanf(“%999s”,…)
。这将最多解析999个字符,剩下一个用于终止字符串的必要
0
字节


但是现在来看看如何正确地执行:C中有几个函数确实用于读取输入,其中一个函数用于读取一行输入:
fgets()
。在您的代码中,它将如下所示:

char k[1000];
while(1){
scanf("%s",&k);
    if(k[0] == '\n'){
    exit(0);}
/* Do some processing on k */
memset(k,0,1000);
}
int next_char = getcgar();
if (next_char == EOF){
    your_eof_process();
}
else if (nexr_char == '\n'){
    your_newline_process();
}
char k[1000];
while(fgets(k, 1000, stdin)){
    if(k[0] == '\n'){
        exit(0);
    }
    /* Do some processing on k */
    memset(k,0,1000);
}
我在这里使用了您的原始代码,还有一些进一步的注释:

  • 最好是定义一个宏,而不是使用幻数
    1000
    ,例如
    #定义INPUTSIZE 1000
    ,并使用它,如
    char k[INPUTSIZE]
    fgets(k,INPUTSIZE,stdin)

  • 不需要清除整个数组,因此为了避免不必要的工作,只需将
    k[0]='\0'替换为
    memset()
    或类似。C字符串以第一个
    0
    字节结尾,因此这足以使
    k
    保留空字符串。如果您的程序只执行此处所示的操作,您甚至可以完全消除此问题,因为下一个
    fgets()
    调用无论如何都会覆盖数组(或者在出错时返回
    NULL
    ,这将停止循环)


还要注意的是,
fgets()
读取整行,包括结尾的换行符,因此在处理
k
的内容时要记住这一点,就像以往任何时候一样,这里的问题是
scanf()
的使用不当
scanf()
不用于读取输入,而是用于解析输入,格式字符串告诉它如何解析

在您的例子中,
%s
正在查找一系列非空白字符(IOW,一个单词)和