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

简介: C/C++、C#、 JAV A(三):字符串操作

定义字符串


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 中,左参数代表开始索引,右侧参数代表结束索引。

另外还有插入,删除,替换。。。

C++ 字符串操作,看↓

http://c.biancheng.net/view/1449.html

JAVA 字符串操作,看↓

https://www.cnblogs.com/freeabyss/archive/2013/05/15/3187057.html

相关文章
|
1月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
26天前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
99 60
|
1月前
|
开发框架 Java .NET
C#与Java
在动态且不断发展的软件开发世界中,Java 和 C# 是两个巨头,每个都有自己独特的优势、理念和生态系统。本文深入比较了 Java 和 C#,探讨了它们的历史背景、语言特性、性能指标、跨平台功能等。
C#与Java
|
16天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
36 6
WK
|
24天前
|
安全 Java 编译器
C++和Java哪个更好用
C++和Java各具优势,选择取决于项目需求、开发者偏好及目标平台特性。C++性能出色,适合游戏、实时系统等;Java平台独立性强,适合跨平台、安全敏感应用。C++提供硬件访问和灵活编程范式,Java有自动内存管理和丰富库支持。两者各有千秋,需根据具体需求选择。
WK
17 1
|
28天前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
22 5
|
1月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
50 15
|
1月前
|
Java
JAVA易错点详解(数据类型转换、字符串与运算符)
JAVA易错点详解(数据类型转换、字符串与运算符)
50 4
WK
|
23天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
40 0
WK
|
24天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
38 0
下一篇
无影云桌面