字符串,字符数组(C/C++)

这个地方困惑我好久了,废话不多说

char c1[]="12345";
char *c2="12345";
string c3="12345";
int a1=strlen(c1);
int a2=strlen(c2);
int a3=strlen(c3);//error: cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*' for argument '1' to 'size_t strlen(const char*)'
int b1=c1.length();//error: request for member 'length' in 'c1', which is of non-class type 'char [6]'
int b2=c2.length();//error: request for member 'length' in 'c2', which is of non-class type 'char*'
int b3=c3.length();

int a4=sizeof(c1)/sizeof(char);

int a5=sizeof(c2)/sizeof(char);

a1=5,a2=5,b3=5,a4=6,a5=4 

a1=5,a4=6,个人理解,a1是字符串的长度(在遇到''之前的字符个数),a4是数组的长度:http://www.360doc.com/content/06/0803/10/9577_172067.shtml

char s[100];
cout<<sizeof(s)<<endl;//结果是100

a5=4是因为指针占4个字节,char占1个字节,与c2中的内容没有关系。

http://stackoverflow.com/questions/905355/c-string-length

If you're using a std::string, call length():

std::string str ="hello";
std::cout << str <<":" str.length();// Outputs "hello:5"

If you're using a c-string, call strlen().

constchar*str ="hello";
std::cout << str <<":"<< strlen(str);// Outputs "hello:5"



http://blog.csdn.net/shinehoo/article/details/5823756

C语言中没有专门的字符串变量,如果要将一个字符串存放在变量中,必须使用字符数组,即用一个字符型数组来存放一个字符串,数组中每一个元素存放一个字符。


<1> 定义: char c[10]
<2> 初始化: 
    最简单的方法即逐个赋值: char c[10]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; 10个字符分别赋绐c[0]到c[9]10个元素。

    如果初值个数小于数组长度,则只将这些字符赋绐数组中前面的元素,其余元素自动定为空字符(即'')。
    如char c[12]={'I', ' ', 'a', 'm', ' ', 'h', 'a', 'p', 'p', 'y'}; 则c[10]、c[11]值都为'' 。

  C语言中,将字符串作为字符数组来处理。一般我们用字符数组来存放字符串时,都要先确定一个足够大的数组,而实际并用不了那么多,而我们只关心其有效位,为测定字符串实际长度,C规定了一个"字符串结束标志",以字符 '' 代表。如果有一个字符串,其中第10个字符为'',则此字符串的有效字符为9个。也就是说,在遇到字符''时,表示字符串结束,由它前面的字符组成字符串。
    系统对字符串常量也自动加一个''作为结束符。
  可以用字符串常量来初始化字符数组。如:
    char c[]={"I am happy"};
    也可直接写成:
    char c[]="I am happy"; 注意此时数组的长度不是10,而是11,因为系统自动加上了'/0'结束符。

     字符数组不要求最后一个字符为'',而为了使处理字符数组和字符串的方法一致,便于测定字符串的实际长度,能及方便在程序中处理, 在字符数组末尾也常加上一个''。

  http://www.cnblogs.com/jeffchen/archive/2006/05/09/395535.html

  以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写  "abc",那么编译器帮你存储的是"abc"




PS:一道字符串的题目
假设两个字符串中所含有的字符和个数都相同我们就叫这两个字符串匹配,比如:abcda和adabc,由于出现的字符个数都是相同,只是顺序不同,所以这两个字符串是匹配的。要求高效!
 1 #include <iostream>
 2 using namespace std;
 3 
 4 bool isLike(const char *a,const char *b)
 5 {
 6     int c[128]={0};//ASCII码有128个
 7     int i;
 8     while(*a!='')
 9     {
10         c[(int)*a]++;
11         a++;
12     }
13     while(*b!='')
14     {
15         c[(int)*b]--;
16         b++;
17     }
18     for(i=0;i<128;++i)
19     {
20         if(c[i])
21             return false;
22     }
23     return true;
24 }
25 int main()
26 {
27     bool b1,b2,b3,b4;
28     b1=isLike("abcasd","abcdas");
29     b2=isLike("aaa","aab");
30     b3=isLike(" "," ");
31     b4=isLike("","");
32     cout<<b1<<b2<<b3<<b4<<endl;
33     return 0;
34 }
View Code
 
原文地址:https://www.cnblogs.com/crane-practice/p/3599845.html