C/C++、C#、JAVA(三):字符串操作
C/C++、C#、JAVA(三):字符串操作
[TOC]
定义字符串
C
语言中,没有字符串对象,是使用
char []来存储字符串。
char a[] = "abcdef"; char c[6] = {'a', 'b', 'c', 'd', 'e', '\0'}; char* b = a;
C 语言中,字符串应当以
\0结尾。
定义数组时,必须多一位,用来存储
\0。
C++
C++ 标准库中,使用 string 来表示字符串。string 对象可以直接相加连接。
#include <iostream> #include <string> using namespace std; int main () { string str1 = "Hello"; string str2 = "World"; string str3; int len ; // 复制 str1 到 str3 str3 = str1; cout << "str3 : " << str3 << endl; // 连接 str1 和 str2 str3 = str1 + str2; cout << "str1 + str2 : " << str3 << endl; // 连接后,str3 的总长度 len = str3.size(); cout << "str3.size() : " << len << endl; return 0; } // 示例来自 https://www.runoob.com/cplusplus/cpp-strings.html
C#
C# 中,直接声明字符串就行
string a = "abcdef";
JAVA
JAVA 中,使用 String 声明字符串。
String a = "1234"; String b = new String("1234");
捕捉输入和输出
C 语言中,有多个函数可以从键盘获得用户输入,它们分别是:
scanf()
可以输入多种类型的数据,printf()
可以输出多种类型的数据;getchar()
可以获取单个字符,putchar()
输出单个字符;- gets():获取一行数据,并作为字符串处理;
puts()
输出一行字符串。
C++ 中,可以使用 cin 获取输入字符串,;
C# 中使用
Console.ReadLine()获取字符串,
Console.ReadKey()获取按下的键。
JAVA 可以使用
System.in类或
Scanner类和
BufferedReader类输入字符串,使用
System.out类来输出字符串。
在我学习 JAVA 是,百度了一下 JAVA 获取输入的方法,发现真鸡儿麻烦。下面示例可以看出各种语言获取输入的操作过程
下面是各种语言的核心语法,请一定要牢记:
C语言 版本
char a[10] = "\0"; gets_s(a); // VC中,gets 被更安全的 gets_s 代替了 puts(a); scanf("%s", a); // 加不加 & 都行 printf("%s",a);
C++ 版本
string a; cin >> a; cout << a << endl;
C# 版本
string a; a = Console.ReadLine();
JAVA 版本
String a; Scanner input = new Scanner(System.in); a = input.nextLine(); System.out.println(a); input.close();
JAVA 用起来本人觉得麻烦。
C,C++,C# 的方法,一看基本就学会,JAVA 还要引个
import java.util.Scanner;包。
等值比较
C/C++
我们来编写一个 C++ 程序
string str1 = "1"; string str2 = "1"; cout << (str1 == str2) << endl; char str3[] = "1"; char str4[] = "1"; cout << (str1 == str2) << endl; char str5[] = { '1','\0' }; char str6[] = { '1','\0' }; cout << (str5 == str6) << endl; cout << (str1 == str3) << endl;
结果是
1,1,0,1。
str1,str2,str3,str4 之间是相互相等的,因为他们都是对常量 1 的调用。
C#
C# 中,strng 是引用类型。
==对值类型来说,比较的是值是否相等;对引用类型来说,比较的是引用地址是否相等。
由于 string 类型重写了操作符,因此
==对于 string 来说,是比较字符串是否相同。
string a = "abcd"; string b = "abcd"; Console.WriteLine(a==b);
结果是 true。
C# 中字符串的比较丰富十分丰富,对字符全球化的支持十分给力。
这里就不对此进行讨论了。
JAVA
JAVA 中,我们发现 int -> Integer,double -> Double等,但是 String 只有一个。
JAVA 中,String 未对
==操作符进行重写,因此比较的还是引用地址。
如果想比较字符串是否相同,可以使用
equals。
String a = "1234"; String b = new String("1234"); System.out.println(a == b); // false String c = "1234"; System.out.println(a == c); // true System.out.println(a.equals(b)); // true String d = "abc"; String e = "ABC"; System.out.println(d.equalsIgnoreCase(e)); // true,忽略大小写
字符串操作
字符串搜索
C
C语言中,
strchr用来区配字符串中首次出现指定字符的位置(碰到
\0会提前结束)。返回的是指针。
我们可以使用以下方式转为索引位置
char a[] = "abcdefghijklmnopq"; char* p = strchr(a, 'c'); // 如果找不到会返回 NULL,请自行判断 printf("%d", p - a);
memchr跟
strchr作用差不多,但是碰到
\0不会停。
char a[] = { 'a','\0','b','c','d' }; char* p = strchr(a, 'c'); if (p == NULL) printf("找不到\n"); else printf("索引位置为:%d", p - a + 1); // memchar 返回的是 void*,需要转为 char* p = (char *)memchr(a, 'c', sizeof(a)); if (p == NULL) printf("找不到\n"); else printf("索引位置为:%d", p - a + 1);
strstr()方法则可以搜索字符串的位置。
char a[] = "Hello world!\0"; char* p = strstr(a, "world"); if (p == NULL) printf("找不到\n"); else printf("索引位置为:%d", p - a + 1);
C++
C++ 中,查找字符方式比较多,例如
find()和
rfind(),这里不详细讲述。
find()和
rfind()可以搜索字符和字符串。
示例如下
string a = "my name is 痴者工良,hello,any boy~"; cout << a.find('n') << endl; cout << a.find("name") << endl; cout << a.find("name", 8) << endl; // 从索引为8的位置开始查找 cout << a.find("namez") << endl; // 上面这两个输出中,查找不到,会导致输出的值有问题 // 可以这样解决 // 如果查找不到,会输出 -1 string::size_type index = a.find("namez"); cout << (int)index << endl;
rfind()功能跟
find()一样,但是
rfind()是逆向查找。
string a = "my name is 痴者工良,hello,any boy~"; cout << a.rfind('n') << endl; cout << a.rfind("name") << endl; cout << a.rfind("name", 8) << endl; // 从索引为8的位置开始查找 cout << a.rfind("namez") << endl; // 上面这两个输出中,查找不到,会导致输出的值有问题 // 可以这样解决 // 如果查找不到,会输出 -1 string::size_type index = a.find("namez"); cout << (int)index << endl;
rfind()函数,从后面开始区配,查找成功会返回索引位置。
find_first_of()函数和
find_last_of()函数可以查找字符或字符串第一次出现的位置和最后出现的位置。
可以 参考 http://c.biancheng.net/view/1453.html
C#
C# 的查找方法很多,而且使用方便。
具体可以参考笔者的另一篇文章 https://www.cnblogs.com/whuanle/p/11967014.html#4-systemstring-字符串。
StartsWith()和
EndsWith()可以使用 StringComparison 比较方式、CultureInfo 控制文化相关规则。
StartsWith():字符串开头是否存在符合区配字符串
EndsWith(): 字符串结尾是否存在符合区配字符串
Contains(): 字符串任意位置是否存在区配字符串
IndexOf: 字符串或字符首次出现的索引位置,如果返回值为
-1则表示无区配结果。
使用示例
string a = "痴者工良(高级程序员劝退师)"; Console.WriteLine(a.StartsWith("高级")); Console.WriteLine(a.StartsWith("高级",StringComparison.CurrentCulture)); Console.WriteLine(a.StartsWith("高级",true, CultureInfo.CurrentCulture)); Console.WriteLine(a.StartsWith("痴者",StringComparison.CurrentCulture)); Console.WriteLine(a.EndsWith("劝退师)",true, CultureInfo.CurrentCulture)); Console.WriteLine(a.IndexOf("高级",StringComparison.CurrentCulture));
输出
False False False True True 5
JAVA
JAVA 中,string 的
indexOf()方法返回字符串第一次出现的位置,
lastIndexof()返回最后一次出现的位置。
startsWith查找是否以某个字符串开头。
regionMatches则用于处理全球化的问题。
示例就不写了,参考 C#的。
字符串提取、插入、删除、替换
C#的我就不说了,请参考笔者的另一篇文章
https://www.cnblogs.com/whuanle/p/11967014.html#42-字符串提取、插入、删除、替换
C
strncpy()函数可以复制目标字符串的多个字节到另一个字符串中。适合用来截取字符串,包含
\0。
strncpy()跟
strcpy()一样,只是不包含
\0。
strcpy是将一个字符串放到另一个字符串里,会覆盖另一个字符串。
char a[] = "my name is 痴者工良,hello,any boy~\0"; char b[4] = { '1','1','1','\0' }; // b <- a strncpy(b, a, 3); // 截取前三位 printf("%s\n", b); char aa[] = "my name is 痴者工良,hello,any boy~\0"; char bb[4] = { '1','1','1','\0' }; strncpy(bb, aa + 5, 3); // 从第五位开始,截取三位 printf("%s\n", bb); char c[] = "123456"; char d[] = "a"; // c <- d strcpy(c, d); puts(d); return 0;
可以参考 https://www.cnblogs.com/jixiaohua/p/11330096.html
C 语言中,对字符串的插入和删除、替换,没有或者有我不知道的官方支持函数😜。
前面我们学习了 C 语言的字符串搜索函数
strstr()我们可以使用这个来获取到字符串的起止位置,然后进行后续操作。
C++ 和 JAVA
C++、C#、JAVA 都有
sub方法,使用上也是差不多。
string a = "my name is 痴者工良,hello,any boy~"; cout << a.substr(0,5) << endl; // 第0位开始,截取5个 cout << a.substr(5, 5) << endl; // 第5位开始,截取5个
String a = "my name is 痴者工良,hello,any boy~"; System.out.println(a.substring(0,5)); System.out.println(a.substring(2,7));
C++ 和 C# 的 sub 方法,参数是差不多的,左侧参数代表开始索引,右侧参数代表截取的个数。
JAVA 中,左参数代表开始索引,右侧参数代表结束索引。
另外还有插入,删除,替换。。。我觉得我要疯了。。。
当初立 flag 要写这四种语言的对比学习文章,大概当时是吃饱了撑的。
精力有限,我要早点睡觉了,
C++ 字符串操作,看↓
http://c.biancheng.net/view/1449.html
JAVA 字符串操作,看↓
- 1 通过JNI混合使用Java和C++ -----> 操作字符串
- JAVA与C++::关于JNI中文字符串操作问题总结
- 实例比较C#与C++字符串操作
- C++和Java中字符串操作
- 谈c++ 和 c#关于字符串和其它类型的相加操作
- Java字符串操作及与C#字符串操作的不同
- 谈c++ 和 c#关于字符串和其它类型的相加操作
- JAVA与C++::关于JNI中文字符串操作问题总结
- Java字符串操作和C#字符串操作的不同小结
- C#中一些字符串操作的常用用法
- C#优化字符串操作【月儿原创】
- C#中一些字符串操作的常用用法
- C#优化字符串操作(3)--@"abc"和"abc"区别在那里
- C#中一些字符串操作的常用用法
- java + (C++) != C#
- java通过字符串读取sql数据库的操作
- C#与C++、Java之比较概览
- Java的字符串操作
- C#优化字符串操作(4)--保留2位有效小数及四舍五入
- C# 与 C 、 C++ 、 D 、 Java 的性能比较(三)