gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:05:17 25 4
gpt4 key购买 nike

我正在制作一个简单的程序,从文件中逐个字符读取,将它们放入 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”。

最佳答案

您在代码中以错误的顺序执行操作:代码的结构方式、读取和存储第一个字符已移出循环。在循环中,该字符随后被覆盖。在这种情况下,从 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;
}

注意事项:

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

  • 您不强制要求字符缓冲区input不能被覆盖。这是很危险的,特别是因为你的缓冲区很小。

  • 当您逐个字符构造字符串时,应通过在末尾放置显式 '\0' 来以 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

关于c - 如何阻止我的程序在保存字符之前跳过它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55376692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com