C/C++、C#、JAVA(三):字符串操作
C/C++、C#、JAVA(三):字符串操作
定义字符串
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 字符串操作,看↓
https://www.cnblogs.com/freeabyss/archive/2013/05/15/3187057.html
C/C++、C#、JAVA(三):字符串操作的更多相关文章
- JAVA作业—字符串操作
------------恢复内容开始------------ ------------恢复内容开始------------ ------------恢复内容开始------------ ------- ...
- Java的字符串操作
目录 Java的字符串操作 一.不同字符串操作的对比 1.1 C++中const修饰指针 const在星号的左边,是被指向的常量不可变 const在星号的右边,是指针的指向不可变 二. Java字符串 ...
- Java的字符串操作一些简单的思考
Java的字符串操作 1 .1不可变的String String对象事不可变的,String类中的每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符 ...
- java类库字符串操作
在java类库中,java给我们提供了字符串几个特别的操作,分别是String,Stringbuffer,Stringbuilder等.下面就对这几个类做一个简单的介绍.首先,我们先了解一下Strin ...
- Java基础(一)-- Java对字符串操作大全
一.Java字符串类基本概念 在JAVA语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:二类是在程序中会被改变长度的可变字符串.J ...
- Java String 字符串操作小结
// 转载加编辑 -- 21 Apr 2014 1. Java字符串中子串的查找 Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现 ...
- Java Script 字符串操作
JS中常用几种字符串操作: big() small() bold() fontcolor() fontsize() italics() strike() link() charAt() charCod ...
- 四:Java之字符串操作String、StringBuffer和StringBuilder
string是我们经经常使用到的一个类型,事实上有时候认为敲代码就是在重复的操作字符串,这是C的特点,在java中.jdk非常好的封装了关于字符串的操作.三个类String .StringBuffer ...
- 使用javap分析Java的字符串操作
我们看这样一行简单的字符串赋值操作的Java代码. String a = "i042416"; 使用命令行将包含了这行代码的Java类反编译查看其字节码: javap -v con ...
- android TextView字体设置最少占多少行. 及其 Java String 字符串操作 . .
① 字体设置: 修改代码 : GridViewActivity.java priceTv为 TextView priceTv.setMaxLines(3); //当多与7个字fu的时候 , 其余字 ...
随机推荐
- ARC150D - Removing Gacha (树上期望)
Link 题意: 给一棵 \(n\) 个节点的树,称一个点是好的,当且仅当它到根的路径上都是黑色(包括自己).每次在不好的节点中随机选一个把它涂成黑色(不管原来它是否是白的),直到所有点都是好的为止. ...
- 2020美亚个人赛wp
案例背景 2020年9月,数名信用卡持有人向警方报案,指他们的信用卡被不知名人士在一家本地网上商店购买手机.订单大部分来自海外的网络地址,但有一宗订单来自本地.警方经调查后发现该本地网络地址的注册地址 ...
- Windows 核心编程笔记 [2] 字符串
1. ANSI 和 Unicode Windows 中涉及字符串的函数有两个版本 1)ANSI版本的函数会把字符串转换为Unicode形式,再从内部调用函数的Unicode版本 2)Unicode版本 ...
- 人工智能自然语言处理:N-gram和TF-IDF模型详解
人工智能自然语言处理:N-gram和TF-IDF模型详解 1.N-gram 模型 N-Gram 是一种基于统计语言模型的算法.它的基本思想是将文本里面的内容按照字节进行大小为 N 的滑动窗口操作,形成 ...
- 月薪10K码农,跳槽到40K架构师,技术学习路线图汇总
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.介绍 Hey there! Roadmap to becoming a web devel ...
- org.apache.hadoop.security.AccessControlException: Queue root.online already has 0 applications, cannot accept submission of application
org.apache.hadoop.security.AccessControlException: Queue root.online already has 0 applications, can ...
- 谁更适合搭配甜点显卡?i7-13700KF、锐龙7 7800X3D对比:游戏相当 生产力Intel强了50%
一.前言:如果搭配2000元甜点显卡 i7-13700KF和锐龙7 7800X3D谁更有性价比? 现在AMD最受欢迎的处理器无疑是拥有96MB三级缓存的锐龙7 7800X3D,这是一颗专为游戏而生的处 ...
- 跑通的第一个ethers.js程序HelloVitalik.js
简介 ethers.js是一个本地库,可以让你调用接口,用官方写好的轮子来使用一些常用的函数!学习完这个库,你对node.js就有比较深入的了解了,如果你不做项目,就不涉及智能合约的编写,那么写点脚本 ...
- macOS 远程桌面windows方法
1.利用微软官方的软件:https://learn.microsoft.com/en-us/windows-server/remote/remote-desktop-services/clients/ ...
- macOS 上 常用的操作
首先 mac上 若使用的是windows的键盘,那么需要把ctrl 键,设置成 cmd键,因为mac上大多数操作都是 基于cmd键. 1.将ctrl键,修改为cmd键,这样后 复制.粘贴.剪切.全选等 ...