1. 统计字符串中单词的个数
题目要求:
输入一个正整数repeat (0<repeat<10)并换行,然后做repeat次下列运算: 输入一行字符,统计其中单词的个数。各单词之间用空格分隔,空格数可以是多个。 说明: 1)使用c=line.charAt(i);表示从line中获得第i个字符,i从0开始。 2)line中的字符个数为:line.length() 例:括号内是说明 输入 2 (repeat=2) Reold building room 123 Programming is fun 输出 4 3
解答1:
import java.util.Scanner;
public class Test40031{
public static void main(String []args ){
int ri, repeat,count, word,i;
String line;
char c;
Scanner in=new Scanner(System.in);
repeat=(in.nextLine()).charAt(0)-'0';
for(ri=1; ri<=repeat; ri++){
line=in.nextLine();
count=0;
for(i=0;i<line.length();i++){
c=line.charAt(i);
if(c!=' '){
count++;
do{
i++;
if(i<line.length())
c=line.charAt(i);
}while((c!=' ')&&(c!='\0')&&(i<line.length()));
}
}
System.out.println( count);
}
}
}
结果:eclipse能正常执行,结果老是被作业平台报编译错误(md垃圾作业平台。。。)
事实证明是我的出问题了。这个是Java和C的区别,也是不容小看的。
好吧,换方法。
解答2:
import java.util.Scanner;
public class Test40031{
public static void main(String []args ){
int ri, repeat,count, word,i;
String line;
char c;
Scanner in=new Scanner(System.in);
repeat=(in.nextLine()).charAt(0)-'0';
for(ri=1; ri<=repeat; ri++){
line=in.nextLine();
count=0;
word=0;
for(i=0;i<line.length();i++){
if(line.charAt(i)==' ')
word=0;
else {
if(word==0){ //如果word=0,说明之前是空格,现在不是空格。也即遇到了新的单词。
count++;
word=1; //此时标记为“单词”状态
}
}
}
System.out.println( count);
}
}
}
错误原因
java中的字符串String没有像C语言的结尾符’\0’
其实这个问题没有什么好说的,Java里面一切都是对象,是对象的话,字符串肯定就有长度,即然有长度,编译器就可以确定要输出的字符个数,当然也就没有必要去浪费那1字节的空间用以标明字符串的结束了。
学过C/C++的人都有一种固定的思维模式,凡是字符串都是以\0结束,其实C++中未必,不信你查查string这个泛型类,为了与C语言兼容性,它里面有一个方法c_str()就是返回以\0结束的字符串。
而C语言中没有字符串类型,字符串是存放在字符型数组中的。在C语言中,是将字符串作为字符数组来处理的。为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符'\0'作为结束标志 。
并且很有意思的一点:我把我的错误代码放在注释里面,Java也能识别出来。
Java当中,所谓的编译就是把高级的语言翻译成计算机可以识别的机器语言,所以当编译程序编译到注释那段的时候程序也会把它编译成机器码的形似存储在内存里,但是这个机器码并不会执行,如果你学过汇编你就会知道它们的存储空间是不一样的(所以这样平台也会识别出来)
用到的是APT技术
而C语言的注释:不参与编译。
2.Java当中的字符串
public class StringArray{
public static void main(String[] args){
int i;
for (i=0; i<args.length; i++)
System.out.println(args[0]+args[1]);
}
}
输入:000 111
输出:
000111
000111
(字符串加起来只是连在后面)