我正在制作一个简单的程序,逐个字符地读取文件,将它们放入tmp,然后将tmp放入input [i]。但是,程序将一个字符保存在tmp中,然后将下一个字符保存在input [i]中。如何使其不跳过第一个字符?
我试图立即读入input [i],但是后来我无法检查EOF标志。
FILE * file = fopen("input.txt", "r");
char tmp;
char input[5];
tmp= getc(file);
input[0]= tmp;
int i=0;
while((tmp != ' ') && (tmp != '\n') && (tmp != EOF)){
tmp= getc(file);
input[i]=tmp;
length++;
i++;
}
printf("%s",input);
应该打印“ ADD $ 02”,但打印“ DD 02”。
答案 0 :(得分:0)
您正在按照错误的顺序执行代码:代码的结构,读取和存储第一个字符的方式已移出循环。在循环中,该字符随后被覆盖。在这种情况下,请以i = 1
开头。
也许您仍然想读取第一个字符,但是我想您想读取所有内容,直到第一个空格为止,这可能是第一个字符。然后执行以下操作:
#include <stdio.h>
int main(void)
{
char input[80];
int i = 0;
int c = getchar();
while (c != ' ' && c != '\n' && c != EOF) {
if (i + 1 < sizeof(input)) { // store char if the is room
input[i++] = c;
}
c = getchar();
}
input[i] = '\0'; // null-terminate input
puts(input);
return 0;
}
注意事项:
在循环之前读取第一个字符。循环条件和存储char的代码将使用该char。在循环体结束之前,将读取下一个字符,然后将在下一个迭代中对其进行处理。
您不强制要求char缓冲区input
不能被覆盖。这很危险,尤其是因为您的缓冲区很小。
在按字符构造字符串char时,应通过在末尾放置一个显式'\0'
来以空值终止。您必须确保该终结器有空间。几乎所有的系统功能,例如puts
或printf("%s", ...)
都希望字符串以空值结尾。
使getchar
的结果为int
,以便您可以区分所有有效的字符代码和特殊值EOF
。
如果获取下一个项目的第一个调用和后续调用不同,例如使用strtok
标记字符串时,上面的代码很有用。在这里,您还可以选择另一种方法:
while (1) { // "infinite loop"
int c = getchar(); // read a char first thing in a loop
if (c == ' ' || c == '\n' || c == EOF) break;
// explicit break when done
if (i + 1 < sizeof(input)) {
input[i++] = c;
}
}
这种方法具有仅在循环体内处理字符的逻辑,但是必须将其包装在无限循环中,然后使用显式break
。