您的位置:首页 > 编程语言 > C语言/C++

C/C++、C#、JAVA(三):字符串操作

whuanle 2020-03-23 21:34 48 查看 https://www.cnblogs.com/whuanl

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 字符串操作,看↓

https://www.geek-share.com/detail/2579599221.html

标签: