我正在嘗試編寫一個程序來查找用戶提供的最長文本行。但是,它不能正常工作;它給出了最后輸入的數組,但缺少第一個字母。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
,您將覆蓋緩沖區的內容。
由于longest
并line
引用(思考點)內存中的同一個緩沖區,您的代碼打印出最后輸入該緩沖區的內容。
如果你想保留最長的單詞,你需要一個一個地復制實際的字符。
您可以使用循環、Java 實用程序類Arrays.copyOf
或System.arraycopy
.
該Arrays
版本將自動為您分配新數組。
添加回答
舉報
0/150
提交
取消