java - while循环不读取最后一项

标签 java c

我正在尝试读取多行字符串,然后将其拆分然后打印出来。这是字符串:

1T1b5T!1T2b1T1b2T!1T1b1T2b2T!1T3b1T1b1T!3T3b1T!1T3b1T1b1T!5T1*1T

11X21b1X
4X1b1X

当我用 ! 拆分字符串时,我得到的是没有最后一行的字符串:

1T1b5T
1T1b5T1T2b1T1b2T
1T2b1T1b2T1T1b1T2b2T
1T1b1T2b2T1T3b1T1b1T
1T3b1T1b1T3T3b1T
3T3b1T1T3b1T1b1T
1T3b1T1b1T5T1*1T
5T1*1T11X21b1X
11X21b1X

这是我的代码:

import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main {

    public static void main(String args[]) {
        Scanner stdin = new Scanner(new BufferedInputStream(System.in));
        while (stdin.hasNext()) {
            for (String line : stdin.next().split("!")) {
                System.out.println(line);

                for (int i = 0; i < line.length(); i++) {
                    System.out.print(line.charAt(i));
                }
            }
        }
    }

}

我哪里错了,为什么最后一行没有读?在我正确阅读所有行之后,如果我遇到数字,我应该遍历每一行我应该打印下一个字符 n 乘以我刚刚阅读的数字,但这是很长的路要走首先我需要帮助。谢谢

更新:

输出应该是这样的:

1T1b5T
1T2b1T1b2T
1T1b1T2b2T
1T3b1T1b1T
3T3b1T
1T3b1T1b1T
5T1*1T

11X21b1X
4X1b1X

这是 C 中的一个解决方案(我的 friend 不是我解决的),但我仍然想用 JAVA 来解决:

#include <stdio.h>

int main (void)
{
    char row[134];
    for (;fgets (row,134,stdin)!=NULL;)
    {
        int i,j=0;
        for (i=0;row[i]!='\0';i++)
        {
            if (row[i]<='9'&&row[i]>='1')
                j+=(row[i]-'0');
            else if ((row[i]<='Z'&&row[i]>='A')||row[i]=='*')
                for (;j;j--)
                    printf ("%c",row[i]);
            else if (row[i]=='b')
                for (;j;j--)
                    printf (" ");
            else if (row[i]=='!'||row[i]=='\n')
                printf ("\n");
        }
    }
    return 0;
} 

最佳答案

您似乎做的工作比必要的多。 Scanner 可以使用自定义分隔符;在您的情况下,您希望它在换行符或爆炸符上分解输入,所以:

Scanner stdin = new Scanner(System.in);
stdin.useDelimiter("[!\\s]*"); // Break on any combination of whitespace characters and !s

while (stdin.hasNext()) {        // While there's a next token,
    String line = stdin.next();  // read it in
    System.out.println(line);    // and print it out.
}

您对打印语句做了一些奇怪的事情——上面的代码假设您要做的就是打印出每一行。您似乎在代码中尝试执行两次,所以如果我误解了您的意图,请适当修改。

根据您的更新进行编辑: 好的,所以您希望允许空 token 并通过它们。这很简单:只需修改分隔符,使其只匹配一个字符,如下所示:

stdin.useDelimiter("(!|\\r?\\n|\\r)")

如果没有星号,我们将一次只匹配一个东西:一个 bang 或一个换行符(在不同操作系统上发现的三种风格中的任何一种)。

关于java - while循环不读取最后一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2584710/

相关文章:

java.lang.NoSuchMethodError : org. springframework.web.context.ConfigurableWebApplicationContext.setId(Ljava/lang/String;)V

c++ - 如何在 GCC 中通过优化构建 Release模式?

c - 如何在数组中存储数组并进行比较

c - 在 C 中使用定点运算的 Horner 规则

java - 我使用了 doReturn,为什么 Mockito 仍然会在匿名类中调用真正的实现?

java - java中链表实现的算法

具有 16GB 虚拟内存且不断增长的 Java 程序 : is it a problem?

java - 无法打开我的 Android 应用程序的应用程序包目录

c - printf() 打印整个字符矩阵

c - strtol帮助为什么它返回0