- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
*注意:我使用的是 Windows,所以 EOF 对我来说是 ctrl + Z。
一段时间以来,我注意到 EOF 输入在孤立状态下的表现似乎与伴随其他输入时的表现不同。例如,^Z
(Windows 命令提示符中的 EOF 命令)和 a^Z
似乎会导致以下代码出现不同的行为:
#include <stdio.h>
#define MAX 1000
int getline(char s[]);
main() {
int line;
char arr[MAX];
while( (line = getline(arr)) != EOF)
printf("%s",arr);
system("Pause");
return 0;
}
int getline(char s[])
{
int c, i = 0;
while ((c = getchar()) != EOF && c != '\n') {
s[i++] = c;
}
if (c == '\n') {
s[i++] = c;
}
else
return EOF;
s[i] = '\0';
return 1;
}
如果我在命令提示符中输入 ^Z
+ enter,程序会跳转到 system("Pause");
但是,如果我输入 abc ^Z
+ enter,没有任何反应,就像忽略了 EOF 并且从未收到过 '\n'
命令一样。如果此时我再次按回车键,它会显示以下内容:
一个多小时以来,我一直在修补和调试这段代码及其小的变体,似乎找不到任何问题。理论上,如果我输入 abc^Z
+ enter,我希望输入被解释为 abcEOF\n
,这将给出:
s[0] = 'a'
s[1] = 'b'
s[2] = 'c'
i = 3 when loop breaks from c = EOF
if (c == '\n') skipped since c = EOF
leads to else -> return EOF
in main(), line = EOF since that is what the function getline returned
while loop breaks because of above
system("Pause"); follows
我的代码是否有我忽略的问题,或者 EOF 或命令提示符是否有一些我应该注意的怪癖?我几乎可以肯定这不是将 ^Z
与其他值混合导致意外行为的唯一实例。
最佳答案
不要将 CTRL-Z 视为文件结束字符,实际上有一个真实字符和代码点26(这是您通常期望 CTRL-Z 生成的)。
相反,请将 CTRL-Z 视为您的终端设备 指示程序输入流结束的一种方式。如果您要读取磁盘的真实文件并且它包含CTRL-Z,它应该继续读取(尽管在您的某些实现中可能不是这种情况,例如,使用 r
而不是 rb
模式打开它。
在 Windows 中,CTRL-Z 到结束流操作的转换仅在它出现在该行的开始 时发生,这就是为什么你不输入 abc<kbd>CTRL-Z</kbd>
时得到 EOF .
当您在不是行首的字符位置输入 CTRL-Z 时,它会被视为真正的 CTRL-Z,不是流关闭操作。这就是为什么你得到 →
字符,这是代码点 26 处的可打印字符。
关于c - 伴随其他值时的 EOF 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17162167/
我有两个伴随的仿函数,即它们成对出现如果一个是 doX() ,另一个将是 undoX()。 它们是这样声明的: template struct doSomething{
我想看看是否有任何工具或引擎可以将 Ecore(元)模型转换为合金规范? 如果它在考虑伴随的 OCL 表达式的情况下进行这种翻译,那就太好了 :) 谢谢 最佳答案 关于在 Alloy 和 UML 之间
所以我正在按照 ASP.NET 和 MVC 5 一书中的示例进行操作。这是导致错误的 View : @model SportsStore.WebUI.Models.ProductsListViewMo
我是一名优秀的程序员,十分优秀!