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);

memchrstrchr 作用差不多,但是碰到 \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() 函数可以复制目标字符串的多个字节到另一个字符串中。适合用来截取字符串,包含 \0strncpy()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(三):字符串操作的更多相关文章

  1. JAVA作业—字符串操作

    ------------恢复内容开始------------ ------------恢复内容开始------------ ------------恢复内容开始------------ ------- ...

  2. Java的字符串操作

    目录 Java的字符串操作 一.不同字符串操作的对比 1.1 C++中const修饰指针 const在星号的左边,是被指向的常量不可变 const在星号的右边,是指针的指向不可变 二. Java字符串 ...

  3. Java的字符串操作一些简单的思考

    Java的字符串操作 1 .1不可变的String String对象事不可变的,String类中的每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符 ...

  4. java类库字符串操作

    在java类库中,java给我们提供了字符串几个特别的操作,分别是String,Stringbuffer,Stringbuilder等.下面就对这几个类做一个简单的介绍.首先,我们先了解一下Strin ...

  5. Java基础(一)-- Java对字符串操作大全

    一.Java字符串类基本概念 在JAVA语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:二类是在程序中会被改变长度的可变字符串.J ...

  6. Java String 字符串操作小结

    // 转载加编辑 -- 21 Apr 2014 1. Java字符串中子串的查找 Java中字符串中子串的查找共有四种方法,如下: 1.int indexOf(String str) :返回第一次出现 ...

  7. Java Script 字符串操作

    JS中常用几种字符串操作: big() small() bold() fontcolor() fontsize() italics() strike() link() charAt() charCod ...

  8. 四:Java之字符串操作String、StringBuffer和StringBuilder

    string是我们经经常使用到的一个类型,事实上有时候认为敲代码就是在重复的操作字符串,这是C的特点,在java中.jdk非常好的封装了关于字符串的操作.三个类String .StringBuffer ...

  9. 使用javap分析Java的字符串操作

    我们看这样一行简单的字符串赋值操作的Java代码. String a = "i042416"; 使用命令行将包含了这行代码的Java类反编译查看其字节码: javap -v con ...

  10. android TextView字体设置最少占多少行. 及其 Java String 字符串操作 . .

    ①  字体设置: 修改代码 :  GridViewActivity.java priceTv为 TextView priceTv.setMaxLines(3); //当多与7个字fu的时候 , 其余字 ...

随机推荐

  1. 初识VUE响应式原理

    作者:京东零售 吴静 自从Vue发布以来,就受到了广大开发人员的青睐,提到Vue,我们首先想到的就是Vue的响应式系统,那响应式系统到底是怎么回事呢?接下来我就给大家简单介绍一下Vue中的响应式原理. ...

  2. TienChin 活动管理-设置活动的默认状态

    // 设置活动未过期,相当于新增的活动,默认都是未过期的 activity.setActivityStatus(1);

  3. 验证码识别服务2Captcha框架

    2Captcha是一个自动验证码识别服务,主要用于解决各种互联网服务中的验证码问题.在许多网站注册账户或进行敏感操作时,为了验证用户是真实的而不是自动化程序,会出现验证码.用户必须正确输入验证码,才能 ...

  4. 3.1 C/C++ 使用字符与指针

    C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...

  5. 8.3 NtGlobalFlag

    NtGlobalFlag 是一个Windows内核全局标记,在Windows调试方案中经常用到.这个标记定义了一组系统的调试参数,包括启用或禁用调试技术的开关.造成崩溃的错误代码和处理方式等等.通过改 ...

  6. STM32CubeMX教程28 SDIO - 使用FatFs文件系统读写SD卡

    1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 ...

  7. 会话跟踪技术之COOKIE

    会话跟踪技术之COOKIE 一.为什么要用会话控制 我们需要我们的站点可以跟踪客户端与服务器之间的交互,保存和记忆每个用户的身份和信息. 几个疑问 我先访问A页面后访问B页面,HTTP无法知道是不是同 ...

  8. 【路由器】电信光猫中兴 F7010C 折腾记录

    目录 问题描述 解锁超管密码 前言 配置安卓抓包环境 抓包获取超管密码 IPv6 配置 光猫拨号 改用 SLAAC 路由器配置 wan6 配置 wan 配置 lan 配置 验证 参考资料 问题描述 近 ...

  9. 零基础入门Vue之画龙点睛——再探监测数据

    追忆 上一节:零基础入门Vue之影分身之术--列表渲染&渲染原理浅析 虽然我深知,大佬告诉我"先学应用层在了解底层,以应用层去理解底层",但Vue的数据如何检测的我不得不去 ...

  10. Java 中,byte 数据类型的取值范围为什么是 -128 - 127 ?其它数值类型 都雷同

    byte 的取值范围:-128 - 127 基本的数学计算方法,一个byte占8位,第一位为符号位,还有7位,7位能表示最大为:2^7 - 1 怎么来的呢:看如下数学计算 1111 111 = 2^0 ...