C - 如何在保存字符之前阻止我的程序跳过字符



我正在制作一个简单的程序,逐个字符地从文件中读取,将它们放入tmp中,然后将tmp放入input[i]中。但是,程序在 tmp 中保存一个字符,然后在 input[i] 中保存下一个字符。如何让它不跳过第一个字符?

我试图立即读取输入[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"。

你在代码中以错误的顺序做事:你的代码是结构,读取和存储第一个字符的方式被移出循环。在循环中,该字符随后被覆盖。在这种情况下,请从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] = '';                         // null-terminate input
puts(input);
return 0;
}

注意事项:

  • 在循环之前读取第一个字符。 然后,循环条件和存储 char 的代码使用该 char。在循环体结束之前,读取下一个字符,然后在下一次迭代中进行处理。

  • 您不强制不能覆盖 char 缓冲区input。这是危险的,特别是因为您的缓冲区很小。

  • 逐个 char 构造字符串时,应通过在末尾放置显式''来 null 终止它。您必须确保该终结者有空间。几乎所有系统函数(如putsprintf("%s", ...))都希望字符串以 null 结尾。

  • 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

最新更新