在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
或POSIXgetline
。每次都会读取(包括)尾随的'\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
或POSIXgetline
。每次都会读取(包括)尾随的'\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'替换为
代码>或类似。C字符串以第一个memset()
字节结尾,因此这足以使0
保留空字符串。如果您的程序只执行此处所示的操作,您甚至可以完全消除此问题,因为下一个k
调用无论如何都会覆盖数组(或者在出错时返回fgets()
,这将停止循环)NULL
还要注意的是,
fgets()
读取整行,包括结尾的换行符,因此在处理k
的内容时要记住这一点,就像以往任何时候一样,这里的问题是scanf()
的使用不当scanf()
不用于读取输入,而是用于解析输入,格式字符串告诉它如何解析
在您的例子中,%s
正在查找一系列非空白字符(IOW,一个单词)和