精华内容
下载资源
问答
  • 字符串:可变字符串不可变字符串

    千次阅读 2016-04-23 00:01:35
    一 NSString是不可变字符串,所有它所有产生其他字符串方法都是生成一个新的字符串,而不会改变原来字符串 第一种:字面量,它是常量字符串,存储常量区 NSString *str = @"abc"; 第二种是通过 快捷的构造...

    一 NSString是不可变字符串,所有它所有产生其他字符串方法都是生成一个新的字符串,而不会改变原来字符串

    第一种:字面量,它是常量字符串,存储常量区

    NSString *str = @"abc";

    第二种是通过 快捷的构造方法

    NSString stringWithFormat:

    第三种方式 初始化方法

    [NSString allocinitWithFormat:

    二,字符串的获取

    1、获取字符长度

     NSString *str = @"www.itcast.cn";

    long length = str.length;

    2、获取子串

    从哪个索引开始截取到字符串的末尾(包含索引上字符)

    NSString *str2 = [str substringFromIndex:4];

    从字符开头开始截取到索引的位置(不包含索引上的字符)

    NSString *str3  = [str substringToIndex:3];

    从哪个位置开始截取,截取多长

    NSRange range = {4,6};

    NSString *str4 = [str substringWithRange:range];

    获取某个子串所在的区间

    NSRange range1 =  [str rangeOfString:@"itcast"];

    NSLog(@"%@",NSStringFromRange(range));

    NSRange range2 =  [str rangeOfString:@"icast"];

    if (range2.location == NSNotFound) {

            NSLog(@"没有这个子串");

    }

    3字符串以什么开头

    hasPrefix  前缀

    hasSuffix  后缀

    4、字符串的比较

    1)比较是内容,从前往后一个一个的比较

    NSComparisonResult result = [str1 compare:str2];

    NSOrderedAscending = -1L, str1 < str2

    NSOrderedSame,            str1 == str2

    NSOrderedDescending       str1 > str2

    - (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;

    NSCaseInsensitiveSearch 忽略大小写

    NSNumericSearch 用于数值类型的比较

    4、字符串大小写的转变

    uppercaseString  大写

    lowercaseString  小写

    字符转基本数据类型

    int i = intStr.intValue;

    double d = intStr.doubleValue;

    float f = intStr.floatValue;

    C语言字符串转换为OC字符串

    [NSString stringWithCString:"hehe" encoding:NSUTF8StringEncoding];

    OC语言字符串转换为C字符串

    const char *cStr = [str8 cStringUsingEncoding:NSUTF8StringEncoding];

    在原有字符串的末尾拼接另一个字符产生一个新的字符串

    stringByAppendingString:

    字符替换(去掉字符串中的空格)

    - (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)replacement

    使用某个字符串替换掉原来字符串中某个区间的字符串

    NSRange range = [str rangeOfString:@"itcast"];

    str1  = [str stringByReplacingCharactersInRange:range withString:@"传智播客"];

    删除原字符串中的所有指定的字符

    str1 =  [str stringByReplacingOccurrencesOfString:@"itcast" withString:@""];

    【掌握】去掉两头的空格

    str1 = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

    在原来的路径上拼接一个路径

    stringByAppendingPathComponent:

    删除原来文件路径的扩展名.xxx

    stringByDeletingPathExtension:

    为没有扩展名的文件路径添加扩展名

    stringByAppendingPathExtension:

    二 NSMutableString 可变字符,它是NSString子类 可以进行增改删的操作,一个字符串需要经常修改其中的内容,那么就使用NSMutableString

    Capacity 表示容量,可以容纳多少字符,如果你字符串超这个存储空间它扩展它

    stringWithCapacity

    - (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;展它插入字符串

    - (void)deleteCharactersInRange:(NSRange)range;删除range范围内的字符串

    - (void)appendString:(NSString *)aString;拼接字符串

    - (void)appendFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);

    - (void)setString:(NSString *)aString;


    注意:可变字符串不能使用字面量的方式赋值,字面量定义的是一个不可以变字符串.例如下面所写错误

    NSMutableString *strMM = @"abc";

    


    展开全文
  • c++字符串与c字符串

    万次阅读 多人点赞 2019-05-27 19:32:26
    字符串字面量3.C++ std::string 类3.1 C风格字符串的优势和劣势3.2 使用string类3.2.1 std::string 字面量3.2.2 c++字符串的数值转换(1)字符串转数值(2)数值转字符串3.2.3 常用字符串函数3.2.4 原始字符串字面量 ...


    你编写的每个应用程序都会使用某种类型的字符串。使用老式C语言时,没有太多的选择,只
    能使用普通的以null结尾的字符数组来表示字符串。遗憾的是,这种表示方式会导致很多问题,例 如会导致安全攻击的缓冲区溢出。C++ STL包含了一个安全易用的std::string类,这个类没有这些 缺点。

    1. C风格的字符串

    在C语言中,字符串表示为字符的数组。字符串中的最后一个字符是空字符(\0’)
    C++包含一些来自C语言的字符串操作函数,它们在< cstring >头文件中定义。

    函数名称说明
    strlen()返回字符串长度,不包含空字符‘\0’的一字节,字符串长度不等于字符个数
    strcpy()字符串拷贝

    C和C++中的sizeof操作符可用于获得给定数据类型或变量的大小。例如,sizeof(char)返回1,
    因为char的大小是1字节。但是,在C风格的字符串中,sizeof()和strlen()是不同的。绝对不要通过 sizeof()获得字符串的大小。如果C风格的字符串存储为char[],则sizeof()返回字符串使用的实际内存,包括‘\0’字符。例如:

    char text[]= "abcdef";
    size_t s1= sizeof(text); // is 7
    size_t s2 = strlen(text); // is 6
    

    但是,如果C风格的字符串存储为char*, sizeof()就返回指针的大小!例如:

    const char* text2 = "abcdef";
    size_t s3 = sizeof(text2); // is platform-dependent
    size_t s4 = strlen(text2); // is 6
    

    在32位模式编译时,s3的值为4,而在64位编译时,s3的值为8,因为这返回的是指针const char*
    的大小。可在<cstring>头文件中找到操作字符串的C函数的完整列表。

    在Microsoft Visual Studio中使用C风格的字符串函数时,编译器可能会给 出安全相关的警告甚或错误,说明这些函数已经被废弃了。使用其他C标准库函数可以避免这些警告,例如
    strcpy_s()和strcat_s(),这些函数是“安全C库” (ISO/IEC TR 24731)标准的一部分。然而,最好的解决方案是切换到C++的 string 类。

    2. 字符串字面量

    注意,C++程序中编写的字符串要用引号包围。例如,下面的代码输出字符串"hello",这段代码
    包含这个字符串本身,而不是一个包含这个字符串的变量:

    cout <<"hello" << endl;
    

    在上面的代码中,"hello”是一个字符串字面量(string literal),因为这个字符串以值的形式写出,
    而不是一个变量。与字符串字面量关联的真正内存在内存的只读部分中。通过这种方式,编译器可 以重用等价字符串字面量的引用,来优化内存的使用。也就是说,即使一个程序使用了 500次"hello"字符串字面量,编译器也只在内存中创建一个hello实例。这种技术称为字面量池
    (literal pooling)。
    字符串字面量可以赋值给变量,但因为字符串字面量位于内存的只读部分,且使用了字面量池,
    所以这样做会产生风险。C++标准正式指出:字符串字面量的类型为“n个const char的数组”,然而为了向后兼容较老的不支持const的代码,大部分编译器不会强制程序将字符串字面量赋值给 const char类型的变量。这些编译器允许将字符串赋值给不带有const的char,而且整个程序可以 正常运行,除非试图修改字符串。一般情况下,试图修改字符串的行为是没有定义的。它可能会导 致程序崩溃;可能使程序继续执行,看起来没有什么莫名其妙的副作用;可能不加通告地忽略修改 行为;可能修改行为是有效的,这完全取决于编译器。例如,下面的代码展示了未定义的行为:

    char* ptr = "hello"; // Assign the string literal to a variable.
    ptr[1] = 'a ';       // Undefined behavior!
    

    一种更安全的编码方法是在引用字符串常量时,使用指向 const 字符的指针。下面的代码包含
    同样的 bug,但由于这段代码将字符串字面量赋值给 const char* 所以编译器会捕捉到任何写入只 读内存的企图。

    const char* ptr = "hello";  // Assign the string literal to a variable.
    ptr[ 1] = 'a';              // Error! Attempts to write to read-only memory
    

    还可以将字符串字面量用作字符数组(char®的初始值。这种情况下,编译器会创建一个足以放 下这个字符串的数组,然后将字符串复制到这个数组。因此,编译器不会将字面量放在只读的内存中,也不会进行字面量的池操作。

    char arr [] = "hello"; // Compiler takes care of creating appropriate sized 
    					   // character array arr.
    arr[ 1] = 'a ';        // The contents can be modified.
    

    3.C++ std::string 类

    C++提供了一个得到极大改善的字符串概念,并作为标准库的一部分提供了这个字符串的实现。 在C++中,std::string是一个类(实际上是basic string模板类的一个实例),这个类支持
    <cstring >中提 供的许多功能,还能自动管理内存分配。string类在std名称空间的< string >头文件中定义。

    3.1 C风格字符串的优势和劣势

    优势劣势
    很简单,底层使用了基本的字符类型和数组结构为了模拟一等字符串数据类型,需要付出很多努力
    量级轻,如果使用得当,只会占用所需的内存使用难度大,而且很容易产生难以找到的内存bug
    很低级,因此可以按操作原始内存的方式轻松操作和复制字符串没有利用C++的面向对象特性
    能够很好地被C语言程序员理解要求程序员了解底层的表示方式

    3.2 使用string类

    尽管string是一个类,但是几乎总是可以把string当做内建类型使用。事实上,把string想象为
    简单类型更容易发挥string的作用。通过运算符重载的神奇作用,C++的string使用起来比C字符串容易得多。

    3.2.1 std::string 字面量

    源代码中的字符串字面量通常解释为const char*。使用用户定义的标准字面量”s”可以把字符串
    字面量解释为std::string。例如:

    auto stringl = "Hello World"; // stringl will be a const char*
    auto string2 = "Hello World"s; // string2 will be an std::string
    

    3.2.2 c++字符串的数值转换

    数值转字符串字符串转数值
    to_string(int val)int stoi(const string& str, size_t *idx=0, int base=10)
    to_string(unsigned val)long stol(const string& str, size_t *idx=0, int base=10)
    to_string(long val)unsigned long stoul(const string& str, size_t *idx=0, int base=10)
    (1)字符串转数值

    int stoi(const string& str, size_t *idx=0, int base=10)

    stoi将n进制字符串转为十进制,第二个参数是字符串起始位置,第三个参数表示n进制

    也可以直接用重载的 int stoi(const string& str),默认字符串为十进制,起始位置为0,制

    #include<string>
    #include <iostream>
    #include <exception>
    using namespace std;
    int main()
    {
    	int i=0;
    	try
    	{
    		i = stoi("FEEF", 0, 16);
    		//int i = stoi("我的"); 输入非法时,可以捕获异常"invalid stoi argument"
    	}
    	catch (exception e)
    	{
    		cout << e.what() << endl;
    	}
    	system("pause");
    	return 0;
    }
    

    输出结果:
    在这里插入图片描述

    (2)数值转字符串

    转十进制可以用to_string,但是低版本的编译器可能不支持

    转多进制可以用_itoa_s,但似乎没有安全机制,导致无法捕获异常

    	char cstr[20];
    	_itoa_s(100,cstr,2);
    	cout << cstr << endl;
    

    转多进制还可以用 stringstream

    #include<string>
    #include <iostream>
    #include <sstream>
    #include <bitset>
    using namespace std;
    int main()
    {
    
       int num = 1234;
       stringstream stream;
    
       //转二进制
       stream << bitset<16>(num);
       cout << stream.str() <<endl;
       stream.str(""); //清空缓存,如果注释掉,那么会输出所有的历史结果
       //转8进制
       stream << oct << num;
       cout << stream.str() << endl;
       stream.str("");
       //转十六进制
       stream << hex << num;
       cout << stream.str() << endl;
       stream.str("");
       system("pause");
       return 0;
    }
    

    结果:
    在这里插入图片描述

    如果需要把格式化后的字符串通过>>输出到字符串, 必须每次都调用clear()方法

    3.2.3 c++常用字符串函数

    函数功能
    append将字符添加到字符串的末尾
    at返回字符串中的指定位置处的元素的引用
    c_str将字符串的内容转换为 C 样式空终止字符串
    data转换为字符数组的字符串的内容
    empty测试是否该字符串包含的字符
    erase从指定位置字符串中移除元素或某个范围的元素
    find与指定的字符序列匹配的子字符串的第一个匹配项的向前搜索字符串
    find_first_not_of搜索与指定任何的字符串元素相匹配的第一个字符的字符串
    find_first_of搜索与指定任何的字符串元素相匹配的第一个字符的字符串
    rfind向后方向中的首次出现的与指定的字符序列匹配的子字符串搜索字符串
    pop_back清除该字符串的最后一个元素
    push_back该字符串的末尾添加一个元素
    insert将某个元素的数目或某个范围的元素插入到指定位置的字符串
    length返回字符串中的元素的当前数目
    replace替换指定的字符或从其他区域或字符串或 C 字符串复制的字符在字符串中位于指定位置处的元素
    substr从指定位置的字符串开头的复制的子字符串的最大字符数

    3.2.4 原始字符串字面量

    原始字符串字面量(raw string literal)是可以横跨多行代码的字符串字面量,不需要转义嵌入的双引号,像\t和\1!这种转义序列不按照转义序列的方式处理,而是按照普通文本的方式处理。如果像下面这样编写普通的字符串字面量,那么会收到一个编译器错误,因为 字符串包含了未转义的引号:

    string str = "Hello "World"!// Error!
    

    对于普通的字符串,必须转义双引号,如下所示:

    string str = "Hello \"World\"!";
    

    对于原始字符串字面量,就不需要转义引号了。
    原始字符串字面量的写法:

    string str = R"(Hello "World"!)";
    

    原始字符串字面量可以跨越多行代码。例如,如果像下面这样编写普通的字符串字面量,那么会收到一个编译器错误,因为普通的字符串字面量不能跨越多行:

    string str = "Line 1
    Line 2 with \t"; // Error!
    

    可使用如下原始字符串字面量来替代:

    string str = R"(Line 1
    Line 2 with \t)";
    

    这也说明,使用原始字符串字面量时,\t转义字符没有替换为实际的制表符字符,而是按照字面形式保存。将str写入控制台得到的输出如下所示:
    Line 1
    Line 2 with \t
    因为原始字符串字面量以)“结尾,所以使用这个语法时,不能在字符串中嵌入)”。例如,下面的 字符串是不合法的,因为在这个字符串中间包含了一个)”:

    string str = R"(The characters )"n are embedded in this string)" // Error!
    

    如果需要嵌入)",则需要使用扩展的原始字符串字面量语法,如下所示:

    R"d-char-sequence(r-char-sequence)d-char-sequence"
    

    r-char-sequence是实际的原始字符串。d-char-sequence是可选的分隔符序列,原始字符串首尾的分隔符序列应该一致。分隔符序列最多能有16个字符。应选择未出现在原始字符串字面量中的序列作为分隔符序列。上面的例子可以改用唯一的分隔符序列:

    string str = R"-(The characters )" are embedded in this string)-";
    

    在操作数据库查询字符串和正则表达式等字符串时,原始字符串字面量可以令程序的编写更加方便。

    展开全文
  • Java中的String字符串为什么不可变

    千次阅读 2016-05-02 20:38:10
    什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的...

    什么是不可变对象?

    众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。

    区分对象和对象的引用

    对于Java初学者, 对于String是不可变对象总是存有疑惑。看下面代码:

    String s = "ABCabc";
    System.out.println("s = " + s);
    
    s = "123456";
    System.out.println("s = " + s);

    打印结果为:

    s = ABCabc
     s = 123456

    首先创建一个String对象s,然后让s的值为“ABCabc”, 然后又让s的值为“123456”。 从打印结果可以看出,s的值确实改变了。那么怎么还说String对象是不可变的呢? 其实这里存在一个误区: s只是一个String对象的引用,并不是对象本身。对象在内存中是一块内存区,成员变量越多,这块内存区占的空间越大。引用只是一个4字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。

    也就是说,s只是一个引用,它指向了一个具体的对象,当s=“123456”; 这句代码执行过之后,又创建了一个新的对象“123456”, 而引用s重新指向了这个心的对象,原来的对象“ABCabc”还在内存中存在,并没有改变。内存结构如下图所示:

    Java中的String为什么是不可变的? &#8212; String源码分析

    Java和C++的一个不同点是, 在Java中不可能直接操作对象本身,所有的对象都由一个引用指向,必须通过这个引用才能访问对象本身,包括获取成员变量的值,改变对象的成员变量,调用对象的方法等。而在C++中存在引用,对象和指针三个东西,这三个东西都可以访问对象。其实,Java中的引用和C++中的指针在概念上是相似的,他们都是存放的对象在内存中的地址值,只是在Java中,引用丧失了部分灵活性,比如Java中的引用不能像C++中的指针那样进行加减运算。

    为什么String对象是不可变的?

    要理解String的不可变性,首先看一下String类中都有哪些成员变量。 在JDK1.6中,String的成员变量有以下几个:

    public final class String
        implements java.io.Serializable, Comparable<String>, CharSequence
    {
        /** The value is used for character storage. */
        private final char value[];
    
        /** The offset is the first index of the storage that is used. */
        private final int offset;
    
        /** The count is the number of characters in the String. */
        private final int count;
    
        /** Cache the hash code for the string */
        private int hash; // Default to 0

    在JDK1.7中,String类做了一些改动,主要是改变了substring方法执行时的行为,这和本文的主题不相关。JDK1.7中String类的主要成员变量就剩下了两个:

    public final class String  
        implements java.io.Serializable, Comparable<String>, CharSequence {  
        /** The value is used for character storage. */  
        private final char value[];  
    
        /** Cache the hash code for the string */  
        private int hash; // Default to 0

    由以上的代码可以看出, 在Java中String类其实就是对字符数组的封装。JDK6中, value是String封装的数组,offset是String在这个value数组中的起始位置,count是String所占的字符的个数。在JDK7中,只有一个value变量,也就是value中的所有字符都是属于String这个对象的。这个改变不影响本文的讨论。 除此之外还有一个hash成员变量,是该String对象的哈希值的缓存,这个成员变量也和本文的讨论无关。在Java中,数组也是对象(可以参考我之前的文章java中数组的特性)。 所以value也只是一个引用,它指向一个真正的数组对象。其实执行了String s = “ABCabc”; 这句代码之后,真正的内存布局应该是这样的:

    Java中的String为什么是不可变的? &#8212; String源码分析

    value,offset和count这三个变量都是private的,并且没有提供setValue, setOffset和setCount等公共方法来修改这些值,所以在String类的外部无法修改String。也就是说一旦初始化就不能修改, 并且在String类的外部不能访问这三个成员。此外,value,offset和count这三个变量都是final的, 也就是说在String类内部,一旦这三个值初始化了, 也不能被改变。所以可以认为String对象是不可变的了。

    那么在String中,明明存在一些方法,调用他们可以得到改变后的值。这些方法包括substring, replace, replaceAll, toLowerCase等。例如如下代码:

    String a = "ABCabc";  
    System.out.println("a = " + a);  
    a = a.replace('A', 'a');  
    System.out.println("a = " + a);

    打印结果为:

    a = ABCabc
    a = aBCabc

    那么a的值看似改变了,其实也是同样的误区。再次说明, a只是一个引用, 不是真正的字符串对象,在调用a.replace(‘A’, ‘a’)时, 方法内部创建了一个新的String对象,并把这个心的对象重新赋给了引用a。String中replace方法的源码可以说明问题:

    Java中的String为什么是不可变的? &#8212; String源码分析

    读者可以自己查看其他方法,都是在方法内部重新创建新的String对象,并且返回这个新的对象,原来的对象是不会被改变的。这也是为什么像replace, substring,toLowerCase等方法都存在返回值的原因。也是为什么像下面这样调用不会改变对象的值:

    String ss = "123456";
    
    System.out.println("ss = " + ss);
    
    ss.replace('1', '0');
    
    System.out.println("ss = " + ss);

    打印结果:

    ss = 123456
     ss = 123456

    String对象真的不可变吗?

    从上文可知String的成员变量是private final 的,也就是初始化之后不可改变。那么在这几个成员中, value比较特殊,因为他是一个引用变量,而不是真正的对象。value是final修饰的,也就是说final不能再指向其他数组对象,那么我能改变value指向的数组吗? 比如将数组中的某个位置上的字符变为下划线“_”。 至少在我们自己写的普通代码中不能够做到,因为我们根本不能够访问到这个value引用,更不能通过这个引用去修改数组。

    那么用什么方式可以访问私有成员呢? 没错,用反射, 可以反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。下面是实例代码:

    	public static void testReflection() throws Exception {
    
    		//创建字符串"Hello World", 并赋给引用s
    		String s = "Hello World"; 
    
    		System.out.println("s = " + s);	//Hello World
    
    		//获取String类中的value字段
    		Field valueFieldOfString = String.class.getDeclaredField("value");
    
    		//改变value属性的访问权限
    		valueFieldOfString.setAccessible(true);
    
    		//获取s对象上的value属性的值
    		char[] value = (char[]) valueFieldOfString.get(s);
    
    		//改变value所引用的数组中的第5个字符
    		value[5] = '_';
    
    		System.out.println("s = " + s);  //Hello_World
    	}

    打印结果为:

    s = Hello World
     s = Hello_World

    在这个过程中,s始终引用的同一个String对象,但是再反射前后,这个String对象发生了变化, 也就是说,通过反射是可以修改所谓的“不可变”对象的。但是一般我们不这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。例如一个Car对象,它组合了一个Wheel对象,虽然这个Wheel对象声明成了private final 的,但是这个Wheel对象内部的状态可以改变, 那么就不能很好的保证Car对象不可变。


    原文链接:点击打开链接

    展开全文
  • 【C#】不可变字符串String的常用方法

    千次阅读 2015-11-19 16:08:33
    /* 不可变字符串类String常用方法 */ /* 1.string.Contains("string") : 是否包含另一字符 */ string str5 = "今天天气不错呦"; Debug.Log (str5.Contains ("天气")); string fileName = "yanzhaomen.jpg...
    
    		/* 不可变字符串类String常用方法 */
    		/* 1.string.Contains("string") : 是否包含另一字符 */
    
    		string str5 = "今天天气不错呦";
    		Debug.Log (str5.Contains ("天气"));
    
    		string fileName = "yanzhaomen.jpg";
    		if (fileName.Contains (".jpg") || fileName.Contains (".bmp") || fileName.Contains (".gif") || fileName.Contains (".png") || fileName.Contains (".jpeg")) {
    			Debug.Log ("该文件是艳照门图片");
    		} else {
    			Debug.Log ("该文件不是艳照门图片");
    		}
    
    
    	
    		/* 2.string.IndexOf("string"): 找到一个字符串在当前字符串中的位置 */
    		string str1 = "今天天气很不错!明天天气肯定会更好";
    		Debug.Log (str1.IndexOf ("天气")); // 返回第一个"天气"的位置
    
    
    		/* 3.string.LastIndexOf("string"): 原理是从后往前,找到一个字符串在当前字符串的位置 */
    		Debug.Log (str1.LastIndexOf ("天气")); // 
    
    		/* 4.string.PadLeft(int32) */
    		Debug.Log (str1.PadLeft (40)); // 让一串字符长度达到40,不够长度的从左端以空格补全
    
    		/* 5.string.Remove(int,int): 删除字符串中的字符 */
    		Debug.Log (str1.Remove (2)); // 下标从2之后全部删除
    		Debug.Log (str1.Remove (5, 2)); // 下标位置5之后的2个字符(本身算一个)都删除
    
    
    		/* 6.string.Replace("被替换","替换的词") */
    		string str2 = "哈哈哈,今天天气真特么好啊^o^";
    		Debug.Log (str2.Replace ("哈哈", "特么"));
    			
    
    		/* 7.split */  // 切割
    		string str7 = "Unity 游戏 虚拟现实 3D,2D";
    		string[] strArray = str7.Split (' ', ','); // 有空格和逗号的时候自动切割分段 // params:数组参数
    		foreach (string item in strArray) {
    			Debug.Log (item);
    		}
    
    		/* 8.ToUpper */  // 都变成大写
    		string str8 = "asdklfjSAkj";
    		Debug.Log (str8.ToUpper ());
    
    		/* 9.Trim */   // 只能删除 首和尾 的空格
    		string str9 = "   asd fl;sdjf  sdfasl;df ";
    		Debug.Log (str9.Trim ());
    
    		/* 10.Substring */
    		string str10 = "ask213jkashd";
    		Debug.Log (str10.Substring (3)); // 从第3位开始读取
    		Debug.Log (str10.Substring (3, 4));  // 从第3位开始读取,读取本身开始计数的后4位
    
    


    展开全文
  • 本文主要探讨数据库可变字符串类型长度设计问题,最好的策略是只分配真正需要的空间,慷慨是明智的。
  • NSString 是一个不可变字符串类,继承自 NSObject ,用NSString创建出来的字符串对象,一经创建就不能再修改了.我们可以对它执行查找或比较等操作,但是不能通过增加,删除它的字符来动态地改变它.  NSString主要的...
  • Python中可变字符串的操作

    千次阅读 2019-02-12 19:11:51
    在Python中,字符串属于不可变对象,不支持原地修改,如果需要修改其中的值,只能重新创建一个新的字符串对象。 然而,如果确实需要一个支持原地修改的unicode数据对象,可以使用io.StringIO对象或array模块. 代码...
  • 再见,Java字符串不可变

    千次阅读 多人点赞 2020-06-16 10:38:46
    最近,又有好几个小伙伴问我这个问题:“二哥,为什么 Java 的 String 要设计成不可变的啊?”说实话,这也是一道非常经典的面试题,面试官超喜欢问。我之前写过这方面的文章,现在读起来似乎不太满意,所以我决定再...
  • Java可变字符串

    千次阅读 2017-04-18 17:44:55
    java互助分享 2017-03-...当对字符串进行修改的时候,需要使用StringBuilder和StringBuffer。 StringBuilder和StringBuffer之间的不同点: 1.StringBuilder的方法是线程安全的(能同步访问), StringBuffer是线程安
  • JS字符串不可变

    千次阅读 2018-01-06 21:46:05
    ECMAScript中的字符串不可变的,也就是说字符串一旦创建,他们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后用另一个包含新值的字符串填充该变量。
  • 你真的理解Java 字符串不可变性吗?

    万次阅读 多人点赞 2020-08-23 01:46:34
    字符串不可变性是指字符串的字符不可变。 String 的 value 字符数组声明为 final 保证不可变。 真的是这样吗? 下面我们再思考两个问题: 那么字符串不可变究竟是指什么? 是如何保证的呢? 下面看一个奇怪的...
  • 关于C语言字符串处理之可变字符串

    千次阅读 2016-01-25 12:39:36
    今天看到一个帖子,帖子内容大概就是用C语言实现把字符串中的小写字符修改成大写的字符,看到了感觉这还简单,但是一直出现关于内存的问题。 void change(char *str){ char *p = str; while(*p!='\0'){ if(*p>...
  • C++输入字符串的几种方式

    万次阅读 多人点赞 2019-05-10 10:20:21
    最近有复习到 C++ 基础知识,这里总结下在 C++ 中输入字符串的几种方式,有需要的可以参考: 1、cin >> void Cin1() //输入一个数字 { int a, b; cin >> a >> b; cout << "a + ...
  • Python字符串——不可变序列

    千次阅读 2018-08-03 19:52:02
    Python中没有单个字符,只有字符串(单个字符也是字符串字符串是序列的代表。 空字符串——''或"" 常见字符串表达式和字符串常量 ...注意raw字符串不能以单个的反斜杠结尾。 ...
  • StringBuffer可变字符串 == 》值可以改变 构造方法: StringBuffer() : 创建一个空的可变字符串对象 StringBuffer(String s) : 创建一个指定字面量的可变字符串对象 方法:(具体查api文档) append(任何类型的...
  • Java中的String为什么是不可变的?

    万次阅读 多人点赞 2018-09-03 21:27:55
    String类是不可变类,一个String对象被创建以后,包含这个对象中的字符串序列是不可改变的。与其问String为什么是不可变的,还不如问String类是如何实现其对象不可变的。 什么是不可变对象?  如果一个对象它被...
  • Python字符串中删除特定字符的方法

    万次阅读 2020-02-25 09:59:36
    在Python中,字符串不可变的。所以无法直接删除字符串之间的特定字符。 所以想对字符串中字符进行操作的时候,需要将字符串转变为列表,列表是可的,这样就可以实现对字符串中特定字符的操作。 1、删除特定字符 ...
  • 7-4 字符串字母大小写转换 (15 分)

    万次阅读 多人点赞 2018-12-09 16:54:51
    7-4 字符串字母大小写转换 ...输入为一个以“#”结束的字符串超过30个字符)。 输出格式: 在一行中输出大小写转换后的结果字符串。 输入样例: Hello World! 123# 输出样例: hELLO wORLD! 123 从输入的样例...
  • C语言字符串输入输出

    万次阅读 多人点赞 2018-01-26 21:30:39
    字符串的输出 在C语言中,输出字符串的函数有两个: puts():直接输出字符串,并且只能输出字符串。printf():通过格式控制符 %s 输出字符串。除了字符串,printf() 还能输出其他类型的数据。 这两个函数前面...
  • 编一程序,将两个字符串连接起来,不要用strcat函数.

    万次阅读 多人点赞 2018-12-06 09:22:19
    #include &... 不用 strcat 将两个字符串连接起来 */ //写一个这样的函数 void Strcat(char* current, const char* extra) { //while (*current++ != '\0'); //--current; while (*curre
  • Python中修改字符串的几种方法

    千次阅读 多人点赞 2019-02-18 20:23:47
    在Python中,字符串不可变类型,即无法直接修改字符串的某一位字符。因此改变一个字符串的元素需要新建一个新的字符串。 2. Python中常见的修改字符串的方法 2.1 将字符串转换成列表后修改值,然后用join组成新...
  • 详解 Python 字符串(一):字符串基础

    千次阅读 多人点赞 2021-01-16 20:59:45
    在 Python 中,字符串就是一串字符的组合,它是不可变的、有限字符序列,包括可见字符、不可见字符(如空格符等)和转义字符。Python 通过 str 类型提供大量方法来操作字符串,如字符串的替换、删除、截取、复制、...
  • Python 基础之字符串不可变数据类型) 前期我们暂时用windows下python的IDLE的来理解性的学习编写Python程序 准备知识 变量:大小字母写开头或者下划线 出开头的其他的可以为大小写字母数字或者下划线 type...
  • 字符串中的不可见字符

    千次阅读 2018-08-09 10:22:28
    最近用datax导入数据到pipeline的时候,碰到一个报脏数据的错误,检查后发现字符串包含\u0000和\u007f,就以为是这两个unicode字符搞的鬼,写了正则 unicode.replaceAll("[\\s+[\\u007f]\\s+]", "&...
  • 灵魂拷问:为什么 Java 字符串不可变的?

    千次阅读 多人点赞 2019-12-05 09:47:07
    比如说:为什么 Java 字符串不可变的?像这类灵魂拷问的主题,非常值得深思。 对于绝大多数的初级程序员来说,往往停留在“知其然不知其所以然”的层面上——会用,但要说底层的原理,可就只能挠挠头双手一摊一张...
  • 字符串长度的计算与字符串比较

    千次阅读 多人点赞 2016-01-11 17:56:55
    1、带转义字符的字符串  如:“abc!x=/”,其长度为 7 2、带转义字符的字符串  (1) 字符串“abc\n”:其中的’\n’为转义字符(换行符),计算字符串长度时只能计作一个字符,所以该字符串的长度为4(而不是5...
  • sqlserver中字符串与定长字符串

    千次阅读 2018-11-08 13:35:10
    最近做一个工厂的自动化项目使用到sqlserver,查询其中某个值的时候返回的是空值,研究了一下发现该值的类型是nchar,定长unicode编码,网上查了下nchar和nvarchar的区别,nvarchar类型存储时会按字长实际长度两倍...
  • r语言字符串转换为字符串 弦乐 (Strings) The strings are defined as a group of characters. In the R language, the strings are commonly written in between either single or double-quotes. 字符串定义为一...
  • 字符串 https://ww2.mathworks.cn/help/matlab/characters-and-strings.html 创建字符向量 通过将字符序列括在单引号中来创建一个字符向量。 chr = 'Hello, world' chr = 'Hello, world' 字符向量为 char 类型的...
  • 浏览器无法解析包含不可打印字符串的json数据,会报错。 ASCII 字符代码介绍:http://www.jb51.net/shouce/autoit3/source/html/appendix/ascii.htm 处理方法:把不可打印字符找出,并替换成可打印字符即可。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,083,476
精华内容 833,390
关键字:

不可变字符串