我正在尝试读取多行字符串,然后将其拆分然后打印出来。这是字符串:
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/