为什么while循环不以额外的“or”条件结束?

3
我希望当条件“index >= maxlength”时,while循环结束。
问题在于它只显示“请输入一个字符串”。用户输入一个字符串,点击“Enter”后,它就停留在下一行。while循环之后的任何代码都不会被执行。
Please Enter a String: *ddddddddddd*
|

如果我没有"index >=maxlength"这个条件,代码就能正常工作。
 public static int getaline( char message[], int maxlength ) {

    int index = 0;
    int character = 0;
    maxlength = 5;

    System.out.print("Please enter a string: ");
    character = fgetc(System.in);

    while (character != '\n' || index >=maxlength){
        message[index] = (char) character;
        index++;
        character = fgetc(System.in);
    }
    if (index >= maxlength){
        System.out.println("Overflow");
    }
    System.out.println("The amount of elements in the array is" + index);
    return 0;           
}

fgetc 是什么作用? - Sotirios Delimanolis
@SotiriosDelimanolis “File Get Character”...我猜它是将输入重定向到标准输入的方式… - MadProgrammer
@MadProgrammer 那是一些花哨的C函数吗? - Sotirios Delimanolis
@SotiriosDelimanolis 当然让我想起了一个... - MadProgrammer
2个回答

1
如果你希望循环在索引大于或等于最大长度时结束,那么条件应该是相反的:循环应该在索引不是大于或等于最大长度的情况下进行。
while (character != '\n' && index < maxlength)

1
为什么while循环不以额外的“or”条件结束?
因为你的测试说如果index大于maxlength,就继续循环。
它正在执行你所说的,而不是你所想的。计算机就是这样的 :-)
有没有办法在达到最大长度后不允许用户输入更多字符?
这要看你的意思是什么:
- 如果你想知道是否有一种方法可以在读取了“max”个字符后停止接受字符,那么 @JohnKugelman 的答案就回答了这个问题。(问题是直到行尾的字符仍然未被读取...如果你尝试从用户处获取另一个项目,你的应用程序将首先看到这些字符。例如,如果你再次调用 getaline ...) - 如果你想忽略超过“max”的字符,则需要更改代码,以使其不在“max”处停止读取,而是仅在 index 小于 max 时将它们添加到 message 中。 - 如果你想阻止用户输入字符,则没有简单的方法可以做到这一点。也许根本没有办法。(你很可能不想尝试这样做,因为它会引入各种其他问题。)

有没有办法在达到最大长度后不允许用户再输入任何字符?<问题的补充> - the_begging_beginner
谢谢。我采纳了你的建议,对于超过最大长度的未读字符,我应用了“null”。我尝试在while循环中添加另一个条件CTRL+D,以便退出终端。例如“while(character!= '\n' && index <maxlength || character!= EOF)”,但是我遇到了与此问题相同的问题。我是否错误地调用了CTRL+D? - the_begging_beginner
当你在控制台的应用程序中键入^D时,这会导致输入流在之前的字符被消耗后结束。这将导致InputStream.read()返回-1。如果你的fgetc方法返回一个char,那么将fgetc的结果与-1进行比较将始终得到false - Stephen C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接