获取文本而不是 EOF
Get text while not EOF
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define N 256
int main(int argc, const char * argv[]) {
char testo[N];
int i;
printf("PER TERMINARE L'INSERIMENTO PREMERE CTRL+Z oppure CTRL+D \n");
for(i=0;i<N;i++)
{
scanf("%c",&testo[i]);
/* if(testo[i]=='h' && testo[i-1]=='c')
{
i--;
testo[i]='k';
}
if(testo[i]==testo[i-1])
{
i--;
} */
if(testo[i]==EOF)
{
break;
}
}
puts(testo);
return 0;
}
编译 /* ... */
中的代码时,我无法停止使用 EOF 插入文本,但是当构建代码并且 运行 如此处所示时,EOF 起作用。
有人知道问题出在哪里吗?
要检测EOF
,检查scanf()
的结果
if scanf("%c",&testo[i]) == EOF) break;
注意:testo[]
不能以空字符结尾。要打印为字符串,请确保它是。
char testo[N];
int i;
// for(i=0;i<N;i++) {
for(i=0;i<(N-1);i++) {
if (scanf("%c",&testo[i]) == EOF) break;
}
testo[i] = '[=11=]'; // add
puts(testo);
您错误地测试了 EOF。使用 scanf()
,您需要查看 return 值。事实上,对于几乎所有的输入函数,如果不捕获和测试,你需要测试 return 值。
从表面上看,您需要:
for (i = 0; i < N; i++)
{
if (scanf("%c", &testo[i]) == EOF)
break;
…
}
但是,一般来说,您应该检查 scanf()
是否按照您的要求进行了尽可能多的成功转换,因此最好写成:
for (i = 0; i < N; i++)
{
if (scanf("%c", &testo[i]) != 1)
break;
…
}
在这个例子中,它真的无关紧要。但是,如果您正在读取数字数据,那将很重要。用户可能键入 Z
而不是数字,而 scanf()
将 return 0,而不是 EOF。
要在文件末尾停止,请检查 scanf
中的 return 值:
scanf
returns 正确解析的输入数。在您的情况下,只要未到达文件末尾,%c
就会正确地从流中读取一个字节。 if (scanf("%c",&testo[i]) != 1) break;
可以。
然而,使用 scanf
从输入流中一次读取一个字节是多余的。在 C 中执行此操作的惯用方法是使用 getchar()
或 getc()
函数。 return 值必须存储在 int
变量中,并且在文件末尾具有特殊值 EOF
。
您还应该使数组长 1 个字节并在末尾存储一个空字节以使其成为 C 字符串,如 puts
所期望的那样。
这是您的程序的修改版本:
int main(int argc, const char *argv[]) {
char testo[N+1];
int i;
printf("PER TERMINARE L'INSERIMENTO PREMERE CTRL+Z oppure CTRL+D\n");
for (i = 0; i < N; i++) {
int c = getchar();
if (c == EOF)
break;
testo[i] = c;
/* ... further processing ... */
}
testo[i] = '[=10=]';
puts(testo);
return 0;
}
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define N 256
int main(int argc, const char * argv[]) {
char testo[N];
int i;
printf("PER TERMINARE L'INSERIMENTO PREMERE CTRL+Z oppure CTRL+D \n");
for(i=0;i<N;i++)
{
scanf("%c",&testo[i]);
/* if(testo[i]=='h' && testo[i-1]=='c')
{
i--;
testo[i]='k';
}
if(testo[i]==testo[i-1])
{
i--;
} */
if(testo[i]==EOF)
{
break;
}
}
puts(testo);
return 0;
}
编译 /* ... */
中的代码时,我无法停止使用 EOF 插入文本,但是当构建代码并且 运行 如此处所示时,EOF 起作用。
有人知道问题出在哪里吗?
要检测EOF
,检查scanf()
if scanf("%c",&testo[i]) == EOF) break;
注意:testo[]
不能以空字符结尾。要打印为字符串,请确保它是。
char testo[N];
int i;
// for(i=0;i<N;i++) {
for(i=0;i<(N-1);i++) {
if (scanf("%c",&testo[i]) == EOF) break;
}
testo[i] = '[=11=]'; // add
puts(testo);
您错误地测试了 EOF。使用 scanf()
,您需要查看 return 值。事实上,对于几乎所有的输入函数,如果不捕获和测试,你需要测试 return 值。
从表面上看,您需要:
for (i = 0; i < N; i++)
{
if (scanf("%c", &testo[i]) == EOF)
break;
…
}
但是,一般来说,您应该检查 scanf()
是否按照您的要求进行了尽可能多的成功转换,因此最好写成:
for (i = 0; i < N; i++)
{
if (scanf("%c", &testo[i]) != 1)
break;
…
}
在这个例子中,它真的无关紧要。但是,如果您正在读取数字数据,那将很重要。用户可能键入 Z
而不是数字,而 scanf()
将 return 0,而不是 EOF。
要在文件末尾停止,请检查 scanf
中的 return 值:
scanf
returns 正确解析的输入数。在您的情况下,只要未到达文件末尾,%c
就会正确地从流中读取一个字节。 if (scanf("%c",&testo[i]) != 1) break;
可以。
然而,使用 scanf
从输入流中一次读取一个字节是多余的。在 C 中执行此操作的惯用方法是使用 getchar()
或 getc()
函数。 return 值必须存储在 int
变量中,并且在文件末尾具有特殊值 EOF
。
您还应该使数组长 1 个字节并在末尾存储一个空字节以使其成为 C 字符串,如 puts
所期望的那样。
这是您的程序的修改版本:
int main(int argc, const char *argv[]) {
char testo[N+1];
int i;
printf("PER TERMINARE L'INSERIMENTO PREMERE CTRL+Z oppure CTRL+D\n");
for (i = 0; i < N; i++) {
int c = getchar();
if (c == EOF)
break;
testo[i] = c;
/* ... further processing ... */
}
testo[i] = '[=10=]';
puts(testo);
return 0;
}