【问题标题】:Java String Concatenation error in output输出中的 Java 字符串连接错误
【发布时间】:2020-04-12 20:44:31
【问题描述】:

我是 Java 初学者,遇到了这个学校问题:

XYZ 门控小区的权限要其居民姓名数据应按以下格式存储-居民姓名他/她父亲的姓名。编写一个程序,将父亲的名字与居民的名字连接起来。名称应经过验证,验证时名称应仅包含字母且允许空格。如果名称无效,则显示消息“Invalid name”。如果是有效字符串,则将其转换为大写并打印出来

Sample Input 1:

Inmate's name:Aron

Inmate's father's name:Terby

Sample Output 1:

ARON TERBY

错误:每当我输入两个字母的囚犯名字时,它都会打印出“无效输入”,例如 Aron Kumar,否则对于单个单词字符串输入代码可以正常工作。

这是我写的代码:


     Scanner sc=new Scanner(System.in);
     System.out.println("Inmate's name:"); //if I enter 2 word string,output-"Invalid name1"//
     String name=sc.nextLine();
     System.out.println("Inmate's father's name:");
     String fname=sc.nextLine();

        String s3=name.toUpperCase();
        String s4=fname.toUpperCase();

        char[] a1= s3.toCharArray();
        char[] a2= s4.toCharArray();
        for(int i=0;i<a1.length;i++)
        {   
            if(a1[i]>='A' && a1[i]<='Z')
             count=1;

            else {
                System.out.print("Invalid name1");
                count=0;
                break; }
        }

        if(count==1)
        {
            for(int i=0;i<a2.length;i++)
           {
            if(a2[i]>='A' && a2[i]<='Z')
            count=2;

            else   {
            System.out.print("Invalid name");
            break; }
       }  
           }

       if(count==2) {
         System.out.print(s3+" "+s4);
                   }
   }
}

【问题讨论】:

  • 如果您发布了一个不带行号的minimal reproducible example 会更好,因为它们会阻止任何人复制和运行您的代码。
  • 感谢您的宝贵建议,先生。我是这个平台的初学者,下次我会记住这一点。

标签: java arrays string


【解决方案1】:

问题是您没有检查空格字符。检查如下:

if (a1[i] >= 'A' && a1[i] <= 'Z' || a1[i] == ' ')

您的代码的另一个问题是在每次迭代中将count 的值更改为12,而在循环终止时应该更改它。下面给出更正后的代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int count = 0, i;
        Scanner sc = new Scanner(System.in);
        System.out.println("Inmate's name:"); 
        String name = sc.nextLine();
        System.out.println("Inmate's father's name:");
        String fname = sc.nextLine();

        String s3 = name.toUpperCase();
        String s4 = fname.toUpperCase();

        char[] a1 = s3.toCharArray();
        char[] a2 = s4.toCharArray();
        for (i = 0; i < a1.length; i++) {
            if (!(a1[i] >= 'A' && a1[i] <= 'Z' || a1[i] == ' ')) {
                System.out.print("Invalid name1");
                count = 0;
                break;
            }
        }

        // If 'i' reached a1.length, it means no invalid character was found
        if (i == a1.length) {
            count = 1;
        }

        if (count == 1) {
            for (i = 0; i < a2.length; i++) {
                if (!(a2[i] >= 'A' && a2[i] <= 'Z' || a2[i] == ' ')) {
                    System.out.print("Invalid name");
                    break;
                }
            }

            // If 'i' reached a2.length, it means no invalid character was found
            if (i == a2.length) {
                count = 2;
            }
        }

        if (count == 2) {
            System.out.print(s3 + " " + s4);
        }
    }
}

补充说明:

您可以通过使用正则表达式来缩短代码,如下所示:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Inmate's name: ");
        String name = sc.nextLine();
        System.out.print("Inmate's father's name: ");
        String fname = sc.nextLine();
        if (name.matches("[A-Za-z\\s]+") && fname.matches(("[A-Za-z\\s]+"))) {
            System.out.println(name.toUpperCase() + " " + fname.toUpperCase());
        } else if (!name.matches("[A-Za-z\\s]+")) {
            System.out.println("Inmate's name is invalid");
        } else if (!fname.matches(("[A-Za-z\\s]+"))) {
            System.out.println("Inmate's father's name is invalid");
        }
    }
}

正则表达式的解释,[A-Za-z\\s]+

  1. A-Za-z 用于字母表。
  2. \\s 用于空格。
  3. [A-Za-z\\s]+ 末尾的+ 表示允许出现多个。

示例运行:

Inmate's name: Ram Kumar
Inmate's father's name: Raj Kumar
RAM KUMAR RAJ KUMAR

另一个示例运行:

Inmate's name: Ram5 Kumar
Inmate's father's name: Raj Kumar
Inmate's name is invalid

另一个示例运行:

Inmate's name: Ram Kumar
Inmate's father's name: Raj5 Kumar
Inmate's father's name is invalid

【讨论】:

  • 我认为正则表达式对于刚刚学习编程的人来说可能太高级了。
  • @VGR- 感谢您的反馈。我同意你的看法。这就是为什么我在附加说明下写了这个选项
  • 非常感谢您的解决方案先生,我尝试了解决方案,但错误:需要数组,但找到 int if((a1[i]>='A' && a1[i]
  • @zeus - 我已经更正了您的代码并发布了相同的内容。如果有任何问题/疑问,请随时发表评论。
  • @ArvindKumarAvinash 是的,先生,错误已解决。非常感谢。我已经接受了答案。
【解决方案2】:

当您在 Java 中比较 char 值时,您依赖的是该字符的 ASCII 值。 A 的 ASCII 值为 65,而 Z 的 ASCII 值为 90。

您当前的代码只是评估字符数组中的每个字符,以确保它在 65 到 90 的范围内,包括 65 到 90。然而,空格字符的 ASCII 值是 32,远远超出了该范围。

重写您的代码以接受大写字母空格(由问题描述决定),如下所示:

if((a1[i]>='A' && a1[i]<='Z') || (a1[i] == 32))

【讨论】:

  • 为什么要使用幻数 32 而不是只写 a1[i] == ' '
  • 非常感谢您的解决方案。我尝试了解决方案,但错误:需要数组,但找到 int if((a1[i]>='A' && a1[i]
【解决方案3】:

因为这里发生了

if(a1[i]>='A' && a1[i]<='Z') count=1;

你问“如果数组中的 char 在 A 和 Z 之间,那么 count = 1”

但如果名称为“Aron Kumar”,您在两个单词之间有一个空格符号,而这个空格符号不在 A 和 Z 之间,所以 count 不等于 1,输出为“Invalid Input”。

你也必须检查 char 数组的空间。

你可以把 MarsAtomic 的答案作为一个很好的例子。

【讨论】:

    【解决方案4】:
    import java.util.Scanner;
    import java.util.regex.*;
    
    public class Authority{
        
        public static void main(String[] args)
        {
            Scanner s = new Scanner(System.in);
            
            System.out.println("Inmate's name:");
            
            String Inmate = s.nextLine();
            System.out.println("Inmate's father's name:");
            
            String father = s.nextLine();
            
            if(!Pattern.matches("^[a-zA-Z\\s]+",Inmate))
            {
                System.out.println("Invalid name");
            }
            else if(!Pattern.matches("^[a-zA-Z\\s]+",father))
            {
                System.out.println("Invalid name");
            }
            else
            {
               String k = Inmate +" "+ father;
               System.out.println(k.toUpperCase());
            }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2013-02-11
      • 1970-01-01
      相关资源
      最近更新 更多