C++ string 数组 用strcpy怎么出不来?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ string 数组 用strcpy怎么出不来?相关的知识,希望对你有一定的参考价值。

1 #include <iostream>
2 #include <string>
3 using namespace std;
4 int main()
5
6
7 string sr[3]="ddf","bcd";
8 string s[3];
9 strcpy(s,sr);
10
11 cout<<s[0]<<endl;
12
13 return 0;
14
~
报错:
2.cpp:9: error: cannot convert `std::string*' to `char*' for argument `1' to `char* strcpy(char*, const char*)'
看不懂。

问题2。如何定义string型数组指针啊。。。这程序我是想这样做
1 #include <iostream>
2 #include <string>
3 using namespace std;
4 int main()
5
6
7 string *sr[3]="ddf","bcd";//报错
8 string s[3];
9 strcpy(s[0],*(sr));
10 strcpy(s[1],*(sr+1));
strcpy(s[2],*(sr+2));
11 cout<<s[0]<<s[1]<<s[2]<<endl;
12
13 return 0;
14
~
怎么能出来。。顺便讲解一下strcpy怎么复制string数组啊。。

1.string和char*是不同的。string是智能字符串,这种类型的变量是一个对象,不是一个简单的char指针。它已经重载了“赋值”运算符,因此要赋值直接s[0] = sr[0];s[1] = sr[1];等等即可。

2.string*可不是string,怎么能给string*赋一个"ddf","bcd"这样的东西呢?必须先
string sr[3]="ddf","bcd";
然后
string* psr = sr;

总之,string更像int、float,而不是char[]。strcpy是C语言时代的C风格字符串的复制函数,仅适用于char[],不适用于C++的string类。
参考技术A

拷贝一个string 数组不能用strcpy函数,自己写一个嘛,很简单的,用for循环来实现,大致思路是生命另一个数组,用for循环遍历string数组,将值赋给另一个数组。

参考技术B C++ string 是类,strcpy是C的字符串操作函数,当然不行, 可用c_str()转成以0结尾的C字符串才可用 参考技术C string 不能和const char * 混用的.
string 的好处是提供了丰富的函数接口,便于你对字符串内容进行分析.查找.切割.替换等复杂操作.
因此代码里如果有定义常量字符串的需求的话.最好使用const char 比如:
const char cc1[]="hello";
const char* cc[3]="tom","jerry","disney";
而别用string来定义常量.
另外针对第二题. 请不要对string 使用 一般的 strcat ctrcpy等函数.这些函数最好用于一般的char[] 数组
而对string, 应当使用他自己的配套函数
例如
s4=s1;
s1=s2+s3;
s2=s1.substr(2,4);
s3.erase(4,2);
参考技术D 2楼的说的对,string这个东西的拷贝,查找,合并等操作非常方便,并且安全效率高;
不过 string *psr = sr; 这句不是拷贝一个字符串数组,psr本身没有对象实例,只是指向sr数组实例的指针

c语言中strlen()怎么用

求一个用strlen()写的程序,要求:求输入数字一共有几位,并且逆序输出该组数字

strlen为C语言库函数,包含于string.h中,作用为计算一个字符串(字符数组)中元素的个数,即从数组头部计数,直到遇到字符串结束符\\0为止,计数结果不包括\\0.
其声明为:
unsigned int strlen(char *s);
比如定义字符串:
char *p = "this is for testing";
调用
strlen(p);
返回的结果就是p中元素的个数,即19。

需要注意的是,strlen并不是绝对安全的,如果在传入的字符数组的合法范围内,不存在结束符\\0,那么strlen函数会一直访问下去,超出数组范围,即出现越界访问。
所以使用strlen时,程序员必须确认参数字符数组中包含\\0值,否则会出现不可预知后果。
参考技术A

strlen()函数的作用是统计给定字符串的长度。


函数原型:unsigned int strlen(char *str);

功       能:统计字符串str中字符的个数,不包括'\\0'

返  回  值:返回字符个数


举例:

char *str1 = "abcdef";   // 定义一个字符指针
char str2[] = "abcdef";  // 定义一个字符数组
int len = strlen(str1);  // 统计str1字符的个数,结果为6
int len = strlen(str2);  // 统计str2字符的个数,结果为6

参考技术B 函数声明:extern unsigned int strlen(char *s);

所属函数库:<string.h>

功能:返回s所指的字符串的长度,其中字符串必须以’\0’结尾

参数:s为字符串的初始地址

使用举例:

代码如下

编译运行结果

说明:

函数strlen比较容易理解,其功能和sizeof很容易混淆。其中sizeof指的是字符串声明后占用的内存长度,它就是一个操作符,不是函数;而strlen则是一个函数,它从第一个字节开始往后数,直到遇见了’\0’,则停止

第一 string头文件中的函数strlen 只可以用来测试字符型数组的长度,其他类型不可以

第二 如果要测试int 修改原函数中的参数,会导致数组长度变长(计算机会一直找下去,直到遇到\0)

第三 如果是字符数组,当里面的字符数少于数组长度时,可以正常输出用strlen,如果等于数组长度,则会出现问题

函数介绍:

(推荐教程:c语言教程)

strlen()函数用于计算字符串的长度,直到空结束字符,但不包括空结束字符。

语法结构:

size_t strlen(const char *str)

参数说明:

str -- 要计算长度的字符串。

返回值:

该函数返回字符串的长度
参考技术C strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。
原型:extern unsigned int strlen(char *s);,在Visual C++ 6.0中,原型为size_t strlen( const char *string );,其中size_t实际上是unsigned int,在VC6.0中可以看到这样的代码:typedef unsigned int size_t;。
头文件:string.h
格式:strlen (字符数组名)
功能:计算字符串s的(unsigned int型)长度,不包括'\0'在内
说明:返回s的长度,不包括结束符NULL。

因为字符串是以字符'\0'结尾的,但是这个'\0'在我们的字符串是隐藏的,我们看不到。实际上是有的.例如:
char a[4]="abc";//这里数组的元素个数至少应该是4,否则此字符串不叫字符串了,只能叫字符数组了。
strlen判断一个字符串的结束就是以其末尾的'\0'为界限。其实现代码可以模拟为以下:
int strlen(char *p)

int i=0;
while(*p++)i++;
return i;

所以他是不包括'\0'这个字符的。
参考技术D strlen()只是统计字符串的长度,统计到'\0'结束,但不包括'\0',这个与sizeof()不一样。
对于用双引号引起来的字符串,系统默认最后一位字符为'\0',如你自己定义的:
char a[]="china";
char b[]="china";
另外,数组初始化还可以是一个字符一个字符赋值,如:
char c[]='c','h','i','n','a';
char d[]='c','h','i','n','a','\0';
但系统不会自动给你在最末位添加'\0’
所以在统计char c[]='c','h','i','n','a'时,统计到a时,系统还没找到\0,所以会继续统计,直到找到'\0'为止。所以就有你第三个值为11的情况,这个根据不同的运行环境而定。

以上是关于C++ string 数组 用strcpy怎么出不来?的主要内容,如果未能解决你的问题,请参考以下文章

用数组编写strcpy函数,不用指针

结构体赋值给数组

strcpy()函数和strcmp()函数怎么用?

VS2013 C++中的strcpy用不了,说换成strcpy_s,还是出现错误了。

c++中有几种字符串函数 如strcpy strcat 还有那分别是啥意思?

c++: strcpy 不能使用 char 数组