这是我的代码:
std::make_heap()
编译#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可以正常工作。
有谁知道问题是什么?
答案 0 :(得分:2)
您未正确测试EOF。使用scanf()
,您需要查看返回值。实际上,对于几乎所有输入函数,如果不捕获和测试,则需要测试返回值。
表面上,你需要:
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()
将返回0,而不是EOF。
答案 1 :(得分:1)
要检测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] = '\0'; // add
puts(testo);
答案 2 :(得分:0)
要在文件末尾停止,请检查scanf
的返回值:
scanf
返回正确解析的输入数。在您的情况下,只要尚未到达文件末尾,%c
就会正确地从流中读取一个字节。 if (scanf("%c",&testo[i]) != 1) break;
会这样做。
然而,使用scanf
一次从输入流中读取一个字节是过度的。在C中执行此操作的惯用方法是使用getchar()
或getc()
函数。返回值必须存储在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] = '\0';
puts(testo);
return 0;
}