c语言string函数问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言string函数问题相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <string.h>
main()

char x[]="STRING";
x[0]=0;x[1]='\0';x[2]='0';
printf("%d %d\n",sizeof(x),strlen(x));


运行程序,则字符数组变为"0"和一个结束标志,串长应为1,为什么运行下来计算的串长是0?

bcopy,memccpy,memcpy,strcpy,strncpy

表头文件 #include <string.h>

定义函数 char *strcat (char *dest,const char *src);

函数说明 strcat()会将参数src字符串拷贝到参数dest所指的字符串尾。第一个参数dest要有足够的空间来容纳要拷贝的字符串。

返回值 返回参数dest的字符串起始地址

范例 #include <string.h.>
main()

char a[30]="string(1)";
char b[]="string(2)";
printf("before strcat() : %s\n",a);
printf("after strcat() : %s\n",strcat(a,b));


执行 before strcat () : string(1)
after strcat () : string(1)string(2)

//---------------------------------------------//
strcpy(拷贝字符串)
相关函数 bcopy,memcpy,memccpy,memmove

表头文件 #include<string.h>

定义函数 char *strcpy(char *dest,const char *src);

函数说明 strcpy()会将参数src字符串拷贝至参数dest所指的地址。

返回值 返回参数dest的字符串起始地址。

附加说明 如果参数dest所指的内存空间不够大,可能会造成缓冲溢出(buffer Overflow)的错误情况,在编写程序时请特别留意,或者用strncpy()来取代。

范例 #include<string.h>
main()

char a[30]="string(1)";
char b[]="string(2)";
printf("before strcpy() :%s\n",a);
printf("after strcpy() :%s\n",strcpy(a,b));


执行 before strcpy() :string(1)
after strcpy() :string(2)

//-----------------------------------//
strlen(返回字符串长度)
相关函数

表头文件 #include<string.h>

定义函数 size_t strlen (const char *s);

函数说明 strlen()用来计算指定的字符串s的长度,不包括结束字符"\0"。

返回值 返回字符串s的字符数。

范例 /*取得字符串str的长度*/
#include<string.h>
main()

char *str = "12345678";
printf("str length = %d\n", strlen(str));


执行 str length = 8

//----------------------------------------//
strcmp(比较字符串)
相关函数 bcmp,memcmp,strcasecmp,strncasecmp,strcoll

表头文件 #include<string.h>

定义函数 int strcmp(const char *s1,const char *s2);

函数说明 strcmp()用来比较参数s1和s2字符串。字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strcmp()首先将s1第一个字符值减去s2第一个字符值,若差值为0则再继续比较下个字符,若差值不为0则将差值返回。例如字符串"Ac"和"ba"比较则会返回字符"A"(65)和'b'(98)的差值(-33)。

返回值 若参数s1和s2字符串相同则返回0。s1若大于s2则返回大于0的值。s1若小于s2则返回小于0 的值。

范例 #include<string.h>
main()

char *a="aBcDeF";
char *b="AbCdEf";
char *c="aacdef";
char *d="aBcDeF";
printf("strcmp(a,b) : %d\n",strcmp(a,b));
printf("strcmp(a,c) : %d\n",strcmp(a,c));
printf("strcmp(a,d) : %d\n",strcmp(a,d));


执行 strcmp(a,b) : 32
strcmp(a,c) :-31
strcmp(a,d) : 0
参考技术A io.h>
#include <string.h>
#include <malloc.h>

char *trimblk(char *str);//返回值为字符指针的函数

int main()

char string[] = " Hello my best friend ";
char *convert_string;
printf("The original string is: %s\n", string);
convert_string = trimblk(string);
printf("The converted string is: %s\n",convert_string);
free(convert_string);//释放malloc分配的空间
return 1;


char *trimblk(char *str)

char *convstr = (char*)malloc(strlen(str)+1);//动态分配内存,用来保存转换后的字符串
char *tmp = convstr;
for(;*str != '\0'; str++)

if(*str != ' ') //若字符不为空格,就复制如tmp中
*tmp++ = *str;

*tmp++ = '\0';//加上字符串结束符
return convstr;
参考技术B 应为strlen()计算的结束标志是'\0'即0号字符,0='\0',第一个字符就是'\0'当然没有任何长度
若改成x[0]='0';那么运行结果就是6 1。
参考技术C strlen计算字符串中第一个ascii 0之前的字符个数,x[0]赋值0,也就是字符串的结束标志,所以长度为0本回答被提问者采纳 参考技术D x[0]=0;与x[1]='\0';等价。要将字符'0'赋给x[0],应该这样写。
x[0]='0';

C++string类型与C语言字符数组的转换 std::string.c_str()函数

语法: 
const char *c_str();搜索
c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 
这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针 
比如:最好不要这样: 
char* c; 
string s="1234"; 
c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理

应该这样用: 
char c[20]; 
string s="1234"; 
strcpy(c,s.c_str()); 
这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作

再举个例子
c_str() 以 char* 形式传回 string 内含字符串
如果一个函数要求char*参数,可以使用c_str()方法: 
string s = "Hello World!";
printf("%s", s.c_str()); //输出 "Hello World!"

解析:

c_str()函数返回一个临时的指针,由于是临时的,所以在没有出作用域之前就应该使用strcpy(),将字符串内容拷贝到其他字符数据或者指针中(毕竟可读).
返回的数据只读不可写,因为是const char ;

参考文章1:c++ std::string.c_str()

参考文章2:注意string与c_str()使用带来的问题

以上是关于c语言string函数问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言中有string吗?

c语言中如何在一个函数中调用在另个文件中定义的函数

C语言调用一个函数无法跳出,死循环

关于C语言打印string类字符串的问题

C语言chdir函数用法

重写C语言string.c的部分函数