为了账号安全,请及时绑定邮箱和手机立即绑定

数组赋值不正确

数组赋值不正确

桃花长相依 2023-06-04 15:17:15
我正在尝试编写一个程序来查找用户提供的最长文本行。但是,它不能正常工作;它给出了最后输入的数组,但缺少第一个字母。import java.io.*;public class longestNoCopy{    static final int MAXLINE = 100;     public static void main(String[] args) throws IOException{        int len;        int max;        char line[] = new char[MAXLINE];        char longest[] = new char[MAXLINE];        max=0;        while((len=getLine(line,MAXLINE))>0){            System.out.printf("len: %d\n", len);            if(len>max){        //      System.out.println("New record");                max=len;                longest=line;            }        /*  System.out.print("\nLine: ");            for(int i=0;line[i]!=0;i++)                     System.out.print(line[i]);*/            System.out.println("Longest line so far:");            for(int i=0;longest[i]!=0;i++)                      System.out.print(longest[i]);        }        if(max>0){            System.out.printf("Longest line:\n");            int i;            for(i=0;i<longest.length;i++)                System.out.print(longest[i]);                System.out.printf("\ni: %d, Length: %d\n", i, max);        }    }    static int getLine(char s[], int lim) throws IOException{        InputStreamReader r = new InputStreamReader(System.in);        int c = 0, i = 0;        for(i=0;i<lim-1&&(c=r.read())!=-1&&c!='\n';++i){            s[i]=(char)c;        //  System.out.printf("s[%d]: %c\n", i, s[i]);        }        if(c=='\n'){            s[i]=(char)c;            ++i;        }        // System.out.printf("i: %d\n", i);        s[i]='\0';        return i;    }}我注释掉了一些打印语句,因此您可以选择激活它们。如果我输入:Himynameis它说:最长的行:s而最长的一行应该是:name 顺便说一下,我在 Ubuntu 命令行上运行并使用 Ctrl+D 退出。我知道很多代码很奇怪;我拿了一些 C 代码并尝试更改它,直到它变成一个 Java 程序来比较两种语言。为什么会发生此错误?需要强调的是,我知道这不是用 Java 做事的常用方法,我知道 Scanner 类等。我没有将此代码用于实际应用程序。我只想知道为什么会出现这个错误。
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

您犯的主要错误也是 C 中的错误:
您将引用分配视为缓冲区副本。

在 Java 中,引用有点像 C 中的指针。
它们之间存在差异,但与本示例无关。

有问题的行是这样的:

longest=line;

变量line持有对数组的引用char。上面的代码行将对此数组的引用复制到变量中longest

它不会自己复制数组!

因此,下次您读入时line,您将覆盖缓冲区的内容。
由于longestline引用(思考点)内存中的同一个缓冲区,您的代码打印出最后输入该缓冲区的内容。

如果你想保留最长的单词,你需要一个一个地复制实际的字符。
您可以使用循环、Java 实用程序类Arrays.copyOfSystem.arraycopy.

Arrays版本将自动为您分配新数组。


查看完整回答
反对 回复 2023-06-04
  • 1 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信