精华内容
下载资源
问答
  • JavaScript中的字符串和数组都是类数组(类数组就是包含有length属性,常见的是函数中的arguments的对象以及DOM方法返回的结果)。一、与数组的相似点两者也有很多相似的地方,两者都有length属性以及indexOf()...

    JavaScript中的字符串和数组都是类数组(类数组就是包含有length属性,常见的是函数中的arguments的对象以及DOM方法返回的结果)。

    一、与数组的相似点

    两者也有很多相似的地方,两者都有length属性以及indexOf()和concat()方法。

    c052029115aa1d7b48b6a3b456d229fb.png

    二、与数组的不同点

    在js中,字符串是不可变的(可参考 链接描述 ),而数组是可变的。解释如下:

    let arr = [1, 2, 3];

    arr[1] = 4; // 此时arr = [1, 4, 3]

    let str = 'string';

    str[1] = 'q'; // 此时虽然不会报错,但str还是为'string';就算使用了.charAt(1)也无效,还会报错

    综上,字符串不可变的意思是,字符串的成员函数不会改变其原始值,而是创建并返回一个新的字符串;相比较数组,数组的成员函数都是在其原始值上进行操作。

    字符串和数组还有一个不同点,在于反转函数。数组有一个可变更成员函数reverse(),而字符串则没有,因为字符串是不可变的。

    想要字符串进行反转,需要分为以下三步:

    1、将字符串变为字符数组;

    2、将数组中的字符进行倒转;

    3、将数组中的字符拼接回字符串

    过程如下:

    let str = 'string';

    let nweStr = str.split('').reverse().join(''); // 先拆分,接着逆序,最后拼接,得到的字符串就是'gnirts'

    字符串的内容就到此结束。

    展开全文
  • [Java教程]javascript中数组和字符串的方法比较0 2016-07-19 23:00:05 ×目录[1]可索引 [2]转换 [3]拼接[4]创建[5]位置前面的话字符串和数组有很多的相同之处,它们的方法众多,且相似度很高;但它们又有不同之处,...

    [Java教程]javascript中数组和字符串的方法比较

    0 2016-07-19 23:00:05 ×目录[1]可索引 [2]转换 [3]拼接[4]创建[5]位置

    前面的话

    字符串和数组有很多的相同之处,它们的方法众多,且相似度很高;但它们又有不同之处,字符串是不可变值,于是可以把其看作只读的数组。本文将对字符串和数组的类似方法进行比较

    可索引

    ECMAScript5定义了一种访问字符的方法,使用方括号加数字索引来访问字符串中的特定字符

    可索引的字符串的最大的好处就是简单,用方括号代替了charAt()调用,这样更加简洁、可读并且可能更高效。不仅如此,字符串的行为类似于数组的事实使得通用的数组方法可以应用到字符串上

    如果参数超出范围或是NaN时,则输出undefinedvar str = "hello";console.log(str[0]);//hconsole.log(str[[1]]);//econsole.log(str[false]);//undefinedconsole.log(str[-1]);//undefinedconsole.log(str[NaN]);//undefinedconsole.log(str[]);//报错

    var arr = ['h','e','l','l','o'];console.log(arr[0]);//hconsole.log(arr[[1]]);//econsole.log(arr[false]);//undefinedconsole.log(arr[-1]);//undefinedconsole.log(arr[NaN]);//undefinedconsole.log(arr[]);//报错

    转换

    字符串可以使用split()方法转换为数组;而数组可以使用join()方法转换为字符串

    【split()】

    split()方法基于指定的分隔符将一个字符串分割成多个字符串,并将结果放在一个数组中,分隔符可以是字符串,也可以是一个正则表达式

    该方法可以接受(可选的)第二个参数用于指定数组的大小。如果第二个参数为0-array.length范围内的值时,按照指定参数输出,其他情况将所有结果都输出

    若指定分隔符没有出现在字符串中,则以数组的形式返回原字符串的值var colorText = 'red,blue,green,yellow';console.log(colorText.split(''));//["r", "e", "d", ",", "b", "l", "u", "e", ",", "g", "r", "e", "e", "n", ",", "y", "e", "l", "l", "o", "w"]console.log(colorText.split(','));//["red", "blue", "green", "yellow"]console.log(colorText.split(',',2));//["red", "blue"]console.log(colorText.split(',',6));//["red", "blue", "green", "yellow"]console.log(colorText.split('-'));//["red,blue,green,yellow"]console.log(colorText.split(/\,/));//["red", "blue", "green", "yellow"]console.log(colorText.split(/e/));//["r", "d,blu", ",gr", "", "n,y", "llow"]console.log(colorText.split(/[^\,]+/));//将除去逗号以外的字符串变为分隔符["", ",", ",", ",", ""],IE8-会识别为[",",",",","]

    【join()】

    join()方法可以使用不同的分隔符来构建这个字符串,join()方法只接收一个参数,用作分隔符的字符串,然后返回包含所有数组项的字符串

    如果不给join()方法传入任何值,则使用逗号作为分隔符var a = [1,2,3];console.log(a.join());//'1,2,3'console.log(a.join(' '));//'1 2 3'console.log(a.join(''));//'123'var b = new Array(10);b.join('-');//'---------',9个连字符组成的字符串

    如果数组中的某一项的值是null或者undefined,则该值在join()方法返回的结果中以空字符串表示var colors = [1,undefined,2,null,3];console.log(colors.join());//'1,,2,,3'

    由于字符串是类数组对象,所以,也可以使用join()方法console.log(Array.prototype.join.call('hello', '-'));// "h-e-l-l-o"

    var str = 'test';var arr = str.split('')//["t", "e", "s", "t"]console.log(arr.join('-'));//'t-e-s-t'

    拼接

    字符串和数组共同拥有拼接方法concat()var value = 'hello';console.log(value.concat('world'));//'helloworld'console.log(value.concat(['world']));//'helloworld'console.log(value.concat([['world']]));//'helloworld'

    var value = ['hello'];console.log(value.concat('world'));//["hello", "world"]console.log(value.concat(['world']));//["hello", "world"]console.log(value.concat([['world']]));//["hello", ["world"]]

    创建

    字符串和数组都拥有创建方法slice(),分别用于创建子字符串和子数组

    slice()方法基于当前数组(或字符串)中的一个或多个项创建一个新数组(或字符串),接受一个或两个参数,即要返回项的起始和结束位置,最后返回新数组(或字符串)

    slice(start,end)方法需要两个参数start和end,返回这个数组(或字符串)中从start位置到(但不包含)end位置的一个子数组(或字符串);如果end为undefined或不存在,则返回从start位置到数组(或字符串)结尾的所有项

    如果start是负数,则start = max(length + start,0)

    如果end是负数,则end = max(length + end,0)

    start和end无法交换位置var numbers = [1,2,3,4,5];console.log(numbers.slice(2));//[3,4,5]console.log(numbers.slice(2,undefined));//[3,4,5]console.log(numbers.slice(2,3));//[3]console.log(numbers.slice(2,1));//[]console.log(numbers.slice(-3));//-3+5=2 -> [3,4,5]console.log(numbers.slice(-8));//max(5 + -8,0)=0 -> [1,2,3,4,5]console.log(numbers.slice(0,-3));//-3+5=2 -> [1,2]console.log(numbers.slice(-2,-1));//-2+5=3;-1+5=4; -> [4]

    var stringValue = 'hello world';console.log(stringValue.slice());//'hello world'console.log(stringValue.slice(2));//'llo world'console.log(stringValue.slice(20));//''console.log(stringValue.slice(2,undefined));//'llo world'console.log(stringValue.slice(2,-5));//'llo 'console.log(stringValue.slice(2,-20));//''console.log(stringValue.slice(-2,2));//''console.log(stringValue.slice(-2,-20));//'' console.log(stringValue.slice(-2,20));//'ld'console.log(stringValue.slice(-20,2));//'he'console.log(stringValue.slice(-20,-2));//'hello wor'

    位置

    字符串和数组都拥有查找位置的两个方法:indexOf()和lastIndexOf()。位置方法和中括号[]读取方法正好相反,一个是通过项查找索引,一个是通过索引查找项

    【indexOf()】

    indexOf(search,start)方法接收search和start两个参数,返回search首次出现的位置,如果没有找到则返回-1

    字符串中的search参数会调用String()转型函数,将该参数的非字符串值转换为字符串;而数组中的search参数则使用严格相等运算符(===)进行比较

    不论是数组还是字符串,第二个参数start都会隐式调用Number()转型函数,将start非数字值(undefined除外)转换为数值;若忽略该参数或该参数为undefined、NaN时,start = 0

    若start参数为负数,字符串的处理是将start=0;而数组的处理是start = max(0,start+length)var string = 'hello world world';console.log(string.indexOf('ld'));//9console.log(string.indexOf('ld',undefined));//9console.log(string.indexOf('ld',NaN));//9console.log(string.indexOf('ld',-1));//9console.log(string.indexOf('ld',10));//15console.log(string.indexOf('ld',[10]));//15console.log(string.indexOf('true',[10]));//-1console.log(string.indexOf(false,[10]));//-1

    var arr = ['a','b','c','d','e','a','b'];console.log(arr.indexOf('a',undefined));//0console.log(arr.indexOf('a',NaN));//0console.log(arr.indexOf('a',1));//5console.log(arr.indexOf('a',true));//5console.log(arr.indexOf('a',-1));//max(0,-1+7)=6; -1console.log(arr.indexOf('a',-5));//max(0,-5+7)=2; 5console.log(arr.indexOf('a',-50));//max(0,-50+7)=0; 0

    【lastIndexOf()】

    与indexOf()方法相反,lastIndexOf()方法是从右向左查找

    lastIndexOf(search,start)方法接收search和start两个参数,返回searchString第一次出现的位置,如果没有找到则返回-1

    类似地,字符串中的search参数会调用String()转型函数,将该参数的非字符串值转换为字符串;而数组中的search参数则使用严格相等运算符(===)进行比较

    不论是数组还是字符串,第二个参数start都会隐式调用Number()转型函数,将start非数字值(undefined除外)转换为数值

    若忽略该参数或该参数为undefined、NaN时,字符串的处理是start = length - 1;而数组的处理是start = 0

    若start参数为负数,字符串的处理是将start=0;而数组的处理是start = max(0,start+length)var string = 'hello world world';console.log(string.lastIndexOf('ld'));//15console.log(string.lastIndexOf('ld',undefined));//15console.log(string.lastIndexOf('ld',NaN));//15console.log(string.lastIndexOf('ld',-1));//-1console.log(string.lastIndexOf('h',-1));//0console.log(string.lastIndexOf('w',undefined));//12console.log(string.lastIndexOf('ld',10));//9console.log(string.lastIndexOf('ld',[10]));//9console.log(string.lastIndexOf('true',[10]));//-1console.log(string.lastIndexOf(false,[10]));//-1

    var arr = [1,2,3,'1','2','3'];console.log(arr.lastIndexOf('2'));//4console.log(arr.lastIndexOf(3));//2console.log(arr.lastIndexOf(0));//-1var arr = ['a','b','c','d','e','a','b'];console.log(arr.lastIndexOf('b'));//6console.log(arr.lastIndexOf('b',undefined));//-1console.log(arr.lastIndexOf('a',undefined));//0console.log(arr.lastIndexOf('b',NaN));//-1console.log(arr.lastIndexOf('b',1));//1console.log(arr.lastIndexOf('b',-1));//max(0,-1+7)=6; 6console.log(arr.lastIndexOf('b',-5));//max(0,-5+7)=2; 1console.log(arr.lastIndexOf('b',-50));//max(0,-50+7)=0; -1

    本文网址:http://www.shaoqun.com/a/240686.html

    *特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:admin@shaoqun.com。

    JavaScript

    0

    展开全文
  • 本文将对字符串和数组的类似方法进行比较 可索引  ECMAScript5定义了一种访问字符的方法,使用方括号加数字索引来访问字符串中的特定字符  可索引的字符串的最大的好处就是简单,用方括号代替了charAt()调用...

    前面的话

      字符串数组有很多的相同之处,它们的方法众多,且相似度很高;但它们又有不同之处,字符串是不可变值,于是可以把其看作只读的数组。本文将对字符串和数组的类似方法进行比较

     

    可索引

      ECMAScript5定义了一种访问字符的方法,使用方括号加数字索引来访问字符串中的特定字符

      可索引的字符串的最大的好处就是简单,用方括号代替了charAt()调用,这样更加简洁、可读并且可能更高效。不仅如此,字符串的行为类似于数组的事实使得通用的数组方法可以应用到字符串上

      如果参数超出范围或是NaN时,则输出undefined

    复制代码
    var str = "hello";
    console.log(str[0]);//h
    console.log(str[[1]]);//e
    
    console.log(str[false]);//undefined
    console.log(str[-1]);//undefined
    console.log(str[NaN]);//undefined
    console.log(str[]);//报错
    复制代码
    复制代码
    var arr = ['h','e','l','l','o'];
    console.log(arr[0]);//h
    console.log(arr[[1]]);//e
    
    console.log(arr[false]);//undefined
    console.log(arr[-1]);//undefined
    console.log(arr[NaN]);//undefined
    console.log(arr[]);//报错
    复制代码

     

    转换

      字符串可以使用split()方法转换为数组;而数组可以使用join()方法转换为字符串

    【split()】

      split()方法基于指定的分隔符将一个字符串分割成多个字符串,并将结果放在一个数组中,分隔符可以是字符串,也可以是一个正则表达式

      该方法可以接受(可选的)第二个参数用于指定数组的大小。如果第二个参数为0-array.length范围内的值时,按照指定参数输出,其他情况将所有结果都输出

      若指定分隔符没有出现在字符串中,则以数组的形式返回原字符串的值

    复制代码
    var colorText = 'red,blue,green,yellow';
    console.log(colorText.split(''));//["r", "e", "d", ",", "b", "l", "u", "e", ",", "g", "r", "e", "e", "n", ",", "y", "e", "l", "l", "o", "w"]
    console.log(colorText.split(','));//["red", "blue", "green", "yellow"]
    console.log(colorText.split(',',2));//["red", "blue"]
    console.log(colorText.split(',',6));//["red", "blue", "green", "yellow"]
    console.log(colorText.split('-'));//["red,blue,green,yellow"]
    console.log(colorText.split(/\,/));//["red", "blue", "green", "yellow"]
    console.log(colorText.split(/e/));//["r", "d,blu", ",gr", "", "n,y", "llow"]
    console.log(colorText.split(/[^\,]+/));//将除去逗号以外的字符串变为分隔符["", ",", ",", ",", ""],IE8-会识别为[",",",",","]
    复制代码

    【join()】

      join()方法可以使用不同的分隔符来构建这个字符串,join()方法只接收一个参数,用作分隔符的字符串,然后返回包含所有数组项的字符串

      如果不给join()方法传入任何值,则使用逗号作为分隔符

    复制代码
    var a = [1,2,3];
    console.log(a.join());//'1,2,3'
    console.log(a.join(' '));//'1 2 3'
    console.log(a.join(''));//'123'
    
    var b = new Array(10);
    b.join('-');//'---------',9个连字符组成的字符串
    复制代码

      如果数组中的某一项的值是null或者undefined,则该值在join()方法返回的结果中以空字符串表示

    var colors = [1,undefined,2,null,3];
    console.log(colors.join());//'1,,2,,3'

      由于字符串是类数组对象,所以,也可以使用join()方法

    console.log(Array.prototype.join.call('hello', '-'));// "h-e-l-l-o"
    var str = 'test';
    var arr = str.split('')//["t", "e", "s", "t"]
    console.log(arr.join('-'));//'t-e-s-t'

     

    拼接

      字符串和数组共同拥有拼接方法concat()

    var value = 'hello';
    console.log(value.concat('world'));//'helloworld'
    console.log(value.concat(['world']));//'helloworld'
    console.log(value.concat([['world']]));//'helloworld'
    var value = ['hello'];
    console.log(value.concat('world'));//["hello", "world"]
    console.log(value.concat(['world']));//["hello", "world"]
    console.log(value.concat([['world']]));//["hello", ["world"]]

     

    创建

      字符串和数组都拥有创建方法slice(),分别用于创建子字符串和子数组

      slice()方法基于当前数组(或字符串)中的一个或多个项创建一个新数组(或字符串),接受一个或两个参数,即要返回项的起始和结束位置,最后返回新数组(或字符串)

      slice(start,end)方法需要两个参数start和end,返回这个数组(或字符串)中从start位置到(但不包含)end位置的一个子数组(或字符串);如果end为undefined或不存在,则返回从start位置到数组(或字符串)结尾的所有项

      如果start是负数,则start = max(length + start,0)

      如果end是负数,则end = max(length + end,0)

      start和end无法交换位置

    复制代码
    var numbers = [1,2,3,4,5];
    console.log(numbers.slice(2));//[3,4,5]
    console.log(numbers.slice(2,undefined));//[3,4,5]
    console.log(numbers.slice(2,3));//[3]
    console.log(numbers.slice(2,1));//[]
    
    console.log(numbers.slice(-3));//-3+5=2 -> [3,4,5]
    console.log(numbers.slice(-8));//max(5 + -8,0)=0 -> [1,2,3,4,5]
    
    console.log(numbers.slice(0,-3));//-3+5=2 -> [1,2]
    console.log(numbers.slice(-2,-1));//-2+5=3;-1+5=4; -> [4]
    复制代码
    复制代码
    var stringValue = 'hello world';
    console.log(stringValue.slice());//'hello world'
    console.log(stringValue.slice(2));//'llo world'
    console.log(stringValue.slice(20));//''
    console.log(stringValue.slice(2,undefined));//'llo world'
    
    console.log(stringValue.slice(2,-5));//'llo '
    console.log(stringValue.slice(2,-20));//''
    console.log(stringValue.slice(-2,2));//''
    console.log(stringValue.slice(-2,-20));//''            
    console.log(stringValue.slice(-2,20));//'ld'
    console.log(stringValue.slice(-20,2));//'he'
    console.log(stringValue.slice(-20,-2));//'hello wor'
    复制代码

     

    位置

      字符串和数组都拥有查找位置的两个方法:indexOf()和lastIndexOf()。位置方法和中括号[]读取方法正好相反,一个是通过项查找索引,一个是通过索引查找项

    【indexOf()】

      indexOf(search,start)方法接收search和start两个参数,返回search首次出现的位置,如果没有找到则返回-1

      字符串中的search参数会调用String()转型函数,将该参数的非字符串值转换为字符串;而数组中的search参数则使用严格相等运算符(===)进行比较

      不论是数组还是字符串,第二个参数start都会隐式调用Number()转型函数,将start非数字值(undefined除外)转换为数值;若忽略该参数或该参数为undefined、NaN时,start = 0

      若start参数为负数,字符串的处理是将start=0;而数组的处理是start = max(0,start+length)

    复制代码
    var string = 'hello world world';
    console.log(string.indexOf('ld'));//9
    console.log(string.indexOf('ld',undefined));//9
    console.log(string.indexOf('ld',NaN));//9
    console.log(string.indexOf('ld',-1));//9
    console.log(string.indexOf('ld',10));//15
    console.log(string.indexOf('ld',[10]));//15
    console.log(string.indexOf('true',[10]));//-1
    console.log(string.indexOf(false,[10]));//-1
    复制代码
    复制代码
    var arr = ['a','b','c','d','e','a','b'];
    console.log(arr.indexOf('a',undefined));//0
    console.log(arr.indexOf('a',NaN));//0
    console.log(arr.indexOf('a',1));//5
    console.log(arr.indexOf('a',true));//5
    console.log(arr.indexOf('a',-1));//max(0,-1+7)=6; -1
    console.log(arr.indexOf('a',-5));//max(0,-5+7)=2; 5
    console.log(arr.indexOf('a',-50));//max(0,-50+7)=0; 0
    复制代码

    【lastIndexOf()】

      与indexOf()方法相反,lastIndexOf()方法是从右向左查找

      lastIndexOf(search,start)方法接收search和start两个参数,返回searchString第一次出现的位置,如果没有找到则返回-1

      类似地,字符串中的search参数会调用String()转型函数,将该参数的非字符串值转换为字符串;而数组中的search参数则使用严格相等运算符(===)进行比较

      不论是数组还是字符串,第二个参数start都会隐式调用Number()转型函数,将start非数字值(undefined除外)转换为数值

      若忽略该参数或该参数为undefined、NaN时,字符串的处理是start = length - 1;而数组的处理是start = 0

      若start参数为负数,字符串的处理是将start=0;而数组的处理是start = max(0,start+length)

    复制代码
    var string = 'hello world world';
    console.log(string.lastIndexOf('ld'));//15
    console.log(string.lastIndexOf('ld',undefined));//15
    console.log(string.lastIndexOf('ld',NaN));//15
    console.log(string.lastIndexOf('ld',-1));//-1
    console.log(string.lastIndexOf('h',-1));//0
    console.log(string.lastIndexOf('w',undefined));//12
    
    console.log(string.lastIndexOf('ld',10));//9
    console.log(string.lastIndexOf('ld',[10]));//9
    console.log(string.lastIndexOf('true',[10]));//-1
    console.log(string.lastIndexOf(false,[10]));//-1
    复制代码
    复制代码
    var arr = [1,2,3,'1','2','3'];
    console.log(arr.lastIndexOf('2'));//4
    console.log(arr.lastIndexOf(3));//2
    console.log(arr.lastIndexOf(0));//-1
    
    var arr = ['a','b','c','d','e','a','b'];
    console.log(arr.lastIndexOf('b'));//6
    console.log(arr.lastIndexOf('b',undefined));//-1
    console.log(arr.lastIndexOf('a',undefined));//0
    console.log(arr.lastIndexOf('b',NaN));//-1
    console.log(arr.lastIndexOf('b',1));//1
    console.log(arr.lastIndexOf('b',-1));//max(0,-1+7)=6; 6
    console.log(arr.lastIndexOf('b',-5));//max(0,-5+7)=2; 1
    console.log(arr.lastIndexOf('b',-50));//max(0,-50+7)=0; -1
    复制代码

     

    顺序

    【反转】

      在数组Array中存在reverse()方法来反转数组

    var array = [1,2,4,3,5];
    console.log(array,array.reverse());//[5,3,4,2,1] [5,3,4,2,1]

      而字符串String也可以利用call()或apply()来实现反转

    var str = '12435';
    console.log(str,Array.prototype.reverse.apply(str.split('')).join(''));//'12435' '53421'

    【排序】

      在数组Array中存在sort()方法来对数组排序,默认按字符串升序排列数组项

    var array = [1,2,4,3,5];
    console.log(array,array.sort());//[1,2,3,4,5] [1,2,3,4,5]

      而字符串String也可以利用call()或apply()来实现排序

    var str = '12435';
    console.log(str,Array.prototype.sort.apply(str.split('')).join(''));//'12435' '12345'

     

    转载于:https://www.cnblogs.com/yujihaia/p/7417365.html

    展开全文
  • 本文将对字符串和数组的类似方法进行比较 可索引 ECMAScript5定义了一种访问字符的方法,使用方括号加数字索引来访问字符串中的特定字符 可索引的字符串的最大的好处就是简单,用方括号代替了charAt()调用,这样更加...
  • 而在C语言中是没有String类型的,那么如果要表示一个字符串,就必须使用字符串数组。今天主要就介绍如下三个方面: 一维数组 多维数组 字符串 一维数组 一维数组操作比较简单,但是需要注意,数组长度必须是固定的...
  • 字符串数组 字符串指针 的区别

    千次阅读 2016-12-02 23:29:36
    在C语言中,对字符串的操作主要有两种方式,一是使用字符数组,char str[];二是使用字符指针。那么二者有什么区别呢?下面将分述二者的使用,最后进行比较。 一、字符数组  使用char str[]定义一个...

    C语言中,对字符串的操作主要有两种方式,一是使用字符数组,char str[];二是使用字符指针。那么二者有什么区别呢?下面将分述二者的使用,最后进行比较。


    一、字符数组

            使用char str[]定义一个字符数组str,中括号内可以写上数字表示数组大小,也可以不写。如果不写数字,则必须为字符数组提供初始值,以便编译器进行内存分配。

    可以使用字符串字面值(string literal)来初始化字符数组,也可使用字符字面值(character literal)初始化,如:

    [cpp] view plain copy
     
     
    1. char str1[10]="Hello";  
    2. char str2[]="World";  
    3. char str3[]={'H','e','l','l','o'};  

    只能对字符数组元素的赋值,而不能用赋值语句对整个数组赋值,如:

    [cpp] view plain copy
     
     
    1. char str4[10];  
    2. str4={'H','e','l','l','o'};    // 错误  
    3. str4="Hello";                  // 错误  
    4. str4[0]='H';str4[1]='e';str4[2]='l';str4[3]='l';str4[4]='o';   // 正确  

    可以使用循环将字符数组中的字符一个一个输出,也可以使用cout<<str1直接输出整个数组。

    需要注意的是,上述代码中str1和str2是C风格字符串,而str3不是。C风格字符串,是指以\0结尾的字符数组。C++为了兼容C,而保留了C中字符串的使用方法。

    str1和str2使用字符串字面值进行初始化,字符串字面值使用\0表示字符串结束。因此str2长度为6,需要将\0计算在内。使用strlen函数,计算的是字符串的实际长度,不包含\0。

    而str3则不一样,它没有\0作为结束标志,因而不是C风格字符串,使用cout<<str3可能会出现意想不到的结果。


    二、字符指针

    可以使用char *str指向一个字符串。如:

    [cpp] view plain copy
     
     
    1. char *ptr="C++";  
    2. char strArr[]="C++";  
    3. char *ptr2=strArr;  

    使用cout<<ptr即可输出整个字符串,而使用cout<<*ptr则输出字符串的首字符。

    字符指针也可指向C风格字符串,如ptr就是指向的C风格字符串。如果让ptr指向上节中的str3,输出ptr会出现同样的意想不到的结果。毕竟数组名其实就是一种指针。


    三、区别

    前面简单介绍了一下两种操作字符串的方法,这部分进行比较,是本文的重点。如下代码:

    [cpp] view plain copy
     
     
    1. char s[]="abc";  
    2. char *ptr="abc";  
    3. cout<<s<<endl;               // abc  
    4. cout<<*s<<endl;              // a  
    5. cout<<&s<<endl;              // 地址  
    6. cout<<(s+1)<<endl;           // bc  
    7. cout<<*(s+1)<<endl;          // b  
    8. cout<<&s[1]<<endl<<endl;     // a  
    9. cout<<ptr<<endl;             // abc  
    10. cout<<*ptr<<endl;            // a  
    11. cout<<&ptr<<endl;            // 地址  
    12. cout<<(ptr+1)<<endl;         // bc  
    13. cout<<*(ptr+1)<<endl;        // b  
    14. cout<<&ptr[1]<<endl;         // a  
    这些代码应该能够说明char s[]和char *ptr之间的相似点了。它们都是指向字符串的指针。

    下面说二者的不同之处。如下一段代码:

    [cpp] view plain copy
     
     
    1. char ss[]="C++";  
    2. ss[0]='c';                  // 合法  
    3. char *p="C++";  
    4. p[0]='c';                   // 合法但不正确  
    该段代码在VS2010下编译可以通过,但是运行时程序会停止工作,为什么呢?原因在于p[0]='c'这一语句。该语句试图修改p指向的字符串的首个字符,出现了错误。

    原因在于两种方式对字符数组操作的机制不同。使用char *p="C++"语句后,编译器在内存的文字常量区分配一块内存,保存”C++“这一字符串字面值,然后在栈上分配内存保存p,p的内容为"C++"的地址。p[0]='c'试图修改常量”C++“,程序当然就会崩溃了。而char ss[]="C++"语句,定义了一个数组,编译器为其在栈上分配了内存空间,因而可以进行修改操作。

    因此,可以总结如下:

    (1)char ss[]定义了一个数组,ss可认为是一个常指针,ss不可改变,但ss指向的内容可以发生改变。

    (2)char *p定义了一个可变指针,p可以指向其它对象。但对于char *p=”abc“这样的情况,p指向的是常量,故内容不能改变。


    如下代码进一步说明char ss[]和char *p的区别:

    [cpp] view plain copy
     
     
    1. char *strA()  
    2. {  
    3.     char str[]="Hello";  
    4.     return str;  
    5. }  

    调用该函数,不一定能够得到正确的结果。因为str定义了一个局部数据,是局部变量,存在于函数strA中的栈帧中。当函数调用完成后,栈帧恢复到函数strA调用前的状态,临时空间被重置,为函数分配的栈空间被收回,str所指向的地址也就不存在了。

    将上述代码修改:

    [cpp] view plain copy
     
     
    1. char *strA()  
    2. {  
    3.     char *str="Hello";  
    4.     return str;  
    5. }  

    该函数能够正常运行,因为str指向的字符串字面值被保存在只读的数据段,是全局的,当函数调用完成后,str指向的地址未发生变化。

    综上,可以看出使用char []较容易出错,可能出现不确定的结果。C++提供的string类相比之下,要安全的多了。

    展开全文
  • 数组的很多属性和处理方法在字符串中也是适用的,所以本文将数组和字符串一起进行理解和总结。 2.在数据结构中,数组和字符串都属于比较基础的数据结构类型,他们都属于顺序存储结构。顺序存储结构即在内存空间中...
  • 算法竞赛入门经典——数组和字符串 注意点: 1.比较大的数组应尽量声明在main函数外,否则程序可能无法运行。 2.C语言的数组并不是“一等公民”,而是“受歧视”的。例如,数组不能够进行赋值操作,如果声明“int a...
  • 冒泡排序数字数组和字符串数组

    千次阅读 2016-04-19 17:57:07
    冒泡排序: 将一个整形数组中的元素按照从小到大的顺序排列,具体方法:数组元素先进行一次依次循环比较,找出最大的元素,放在数组最右边, 嵌套循环时要注意循环次数的控制, 进行n-1趟冒泡排序后,就完成了,这里...
  • 而BFS比较经典的运用就是层次遍历,一般会运用数组和while循环不断进行pop和insert操作。 涉及到回溯算法和递归的二叉树结构题,之前已经进行过总结: leetcode回溯算法 leetcode二叉树遍历与递归题目汇总 然而,...
  • 概览 数组在C语言中有着特殊的地位,它有很多特性,例如它的存储是连续的,数组的名称就是数组的地址等...一维数组操作比较简单,但是需要注意,数组长度必须是固定的,长度不能使用变量进行初始化;如果声明的同时...
  • 今天主要就介绍如下三个方面: 一维数组 多维数组 字符串 一维数组 一维数组操作比较简单,但是需要注意,数组长度必须是固定的,长度不能使用变量进行初始化;如果声明的同时进行赋值则数组长度可以省略,编译器会...
  • 在学习一维数组过程中有...对指定的X型数组按数字升序进行排序。 static void sort(X[] a,int fromIndex,int toIndex) 查找指定元素 public static int binarySearch(X[] a,X key) 比较数组中的元素 equls ...
  • 说明:对于数组和字符串的基本理论知识不再做讲解,本篇文章主要记录在进行数组、字符串、二维数组的处理时常用的算法和思路。 总共有以下几个题目(以下所有题目来源都来源于LeetCode,这里统一对题目转载进行说明...
  • 在以前,我们只会使用冒泡排序的方法对整行数组进行排序,简单的两个for循环,外层循环控制循环次数,内层循环控制比较次数,就像下面代码,便可实现: #include<stdio.h> intmain() { intarr[10]={11,9,...
  • 第7章 C/C++指针、数组和字符串 7.1 指针 1、指针就是地址,即存储该指针指向的变量的地址。 2、void* 类型的指针能够被任何类型的指针赋值,因此它不能参与算术运算,只能进行赋值、比较和sizeof()操作。 7.2 ...
  • 标题关于c语言字符数组和字符串相关问题 直奔主题 c语言中字符串是以字符数组形式存储 字符串要要遵守和字符数组一样的规则 c中字符串可以通过字符指针和字符数组取得 在c语言中不能运用c语言运算符对其...
  • * 重点是下边if语句怎么让字符串和字符串数组里的元素进行比较 * 还请各位大神指点迷津! */ if (s.equals(week[i])) { s1=true; break; } } if(s1) { System.out...
  • 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路:找一个二维数组中中间大小的值与输入的目标值进行比较,通过比较大小移动二维数组的索引,选取的是右上角的元素作为比较的...
  • 排序的原理: * 选择排序:每个数字它后面的所有数字进行比较,只要后面的比它大就交换(从大到小的顺序) * 冒泡排序:每次都从第一个元素开始向后,两两进行比较,只要后面的元素比前面的大,就交换(从大到小) * 特点:...
  • 在上次的课程中我们讲述了函数case语句,case语句的语法...case是一个多分支的判断语句,与多个值进行比较时,case是比if语句要好用的多,在这里的PAT可使用GLOB通配符,以及|为或者之意,而如果做非字符串的等值比...
  • //用于string对象的技术用于字符串数组的技术进行比较 #include &lt;iostream&gt; #include &lt;string&gt; //string 与cstring 是两个不同的头文件 #include &lt;cstring&gt; using ...
  • 数组排序和字符串

    2017-08-23 21:32:00
    当运行到最后一个元素的时候,它已经前面所有的元素比较过了,所以次数是length-1; 冒泡排序 二位数组的初始化 二维数组的遍历 利用双重for循环遍历,前提是数组的两个长度都是已知的。 可以是图一...
  • 但是,仅将字节转换为字符串以满足代码约束(例如switch语句中的比较或作为map的key)绝对是浪费CPU时间。让我们回顾一些案例并进行优化。转换从字节数组转换为字符串涉及:如果变量超过当前栈帧,则在堆上分配新字符...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,696
精华内容 678
关键字:

数组和字符串进行比较