日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言字符串拷贝

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言字符串拷贝 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C語言里定義一個字符串可以使用指針也可以使用數組,如:
(1) char *s="hello"; //"hello"是字符串常量s是指向常量的指針,常量是不允許改變的,不能寫成s[0]=X,但可以改變指針的值,使其指向不同的常量,如 s = "Xeron";
(2) char s[]="hello"; //指針常量,s本身的值不能修改,但可以修改其指向的內容,s[0]=X
兩者的區別是
(1)定義的字符串在程序里不能被修改,因為它存放在代碼段內
(2)定義的字符串可被修改,它存放在數據段或者棧內。

這兩種定義字符串的方法在函數內部和外部稍有區別

*函數外部:
(1) char *s="hello"; /*定義了指針s(數據段)和常量字符串"hello"(數據段),s的值為字符串首地址*/
(2) char s[]="hello"; /*定義了字符數組s,數組內容為"hello"(代碼段),注意這里s只是一個符號而不是變量實體*/

*函數內部:
如果在函數內部使用(1),(2)定義,則"hello"字符串本身存放在代碼段,當函數被調用時,
(1) 僅把字符串"hello"的首地址地址賦給s
(2) 把字符串"hello"拷貝一份放到棧內,把拷貝串的首地址賦給s

所以(1)中s所指的內容不能改變,而(2)中s所指的串可修改,s指向的是"hello"串的拷貝,不會影響原串,每次調用函數的時候都拷貝一次

注:在函數內部使用(1)(2)是沒有加static關鍵字修飾的,如果加了static關鍵字,那就跟在函數外部沒什么區別了.
******************************
(1)稍加改變就能滿足"hello"串可修改
char *s = (char []){"hello"}; //好像不可行
此時匿名"hello"串存放在數據段。
也可以給定義一個匿名數組賦給int型指針,如:
int *p=(int [10]){[0 ... 9]=0};

----------------------------------------------------------------------------------------

malloc()和free()的基本概念以及基本用法:

1、函數原型及說明:

void *malloc(long NumBytes):該函數分配了NumBytes個字節,并返回了指向這塊內存的指針。如果分配失敗,則返回一

個空指針(NULL)。

關于分配失敗的原因,應該有多種,比如說空間不足就是一種。

void free(void *FirstByte): 該函數是將之前用malloc分配的空間還給程序或者是操作系統,也就是釋放了這塊內存,

讓它重新得到自由。

2、函數的用法:

???? 其實這兩個函數用起來倒不是很難,也就是malloc()之后覺得用夠了就甩了它把它給free()了,舉個簡單例子:
程序代碼:
??????? // Code...
??????? char *Ptr = NULL;
??????? Ptr = (char *)malloc(100 * sizeof(char));
??????? if (NULL == Ptr)
??? {
??????? exit (1);
??? }
??????? gets(Ptr);

??????? // code...
??????? free(Ptr);
??????? Ptr = NULL;
??????? // code.

?

代碼如下:
?? ? ?? #include<stdio.h>
??????? void str_copy(char *from,char? *to);
??????? main()
??????? {????char *a="I am chinese!";
? ? ? ?? ????char aa[20]="sssssssssssssssssss"; ?
? ? ? ?? ????char * b;
???????????? b=aa;
???????????? str_copy(a,b);
???????????? printf("字符串拷貝后:\n");
???????????? printf("%s",aa); ? ? ? ? //或者??printf("%s",b); ? ? ? ?都成功!!
???????????? printf("\n");
???????? }
????????void str_copy(char *from,char *to)
????????{
? ????????????while(*to++ = *from++);

????????????}
但是我改為一下代碼,卻出現了段錯誤:
??????? #include<stdio.h>
??????? void str_copy(char *from,char? *to);
??????? main()
??????? {????char *a="I am chinese!";?  //對指針變量直接賦值是可以的。這時初始化指針時所創建的字符串常量被定義為只讀。即*a內容不能變
? ? ? ?? ????char *b="ssssssssssssssssssssss"; ?//對指針變量直接賦值是可以的。這時初始化指針時所創建的字符串常量被定義為只讀。即*b內容不能變
? ? ? ?? ??? str_copy(a,b);
???????????? printf("字符串拷貝后:\n");
???????????? printf("%s",b);
???????????? printf("\n");
???????? }
????????void str_copy(char *from,char *to)
????????{
? ????????????while(*to++ = *from++);

????????????}

  所謂段錯誤就是一般指指針未賦值,就是所謂的野指針,但是這種char *b="ssssssssssssssssssssss";字符串定義不是給b分配了指向數組的地址了嗎?為什么會出現這種情況呢?

?

#include?"stdafx.h"
char?*strcpy_v1(char?*dest?,?const?char?*src)
{
????//調試時,使用斷言,入口檢測
????assert(?(dest!=NULL)?&&?(src!=NULL)?);
????
????//注意這里的內存指向參數dest所在的內存,不是棧內存,因而可以在函數中返回
????char?*to?=?dest;
????
????//主要操作在while條件中完成
????while(?(*dest++?=?*src++)!='\0') ? ? ? //判斷是否賦值是'\0'
????{
????????NULL;????
????}
????
????//返回拷貝字符串首地址,方便連綴,比如strlen(strcpy(dest,"hello"))
????return?to;
}

/*
?*?說明:字符串拷貝版本2
?*?參數:dest目標地址,src源地址
?*?返回:返回拷貝好的地址;如果出錯,無定義
?*?異常:可能出現字符串溢出,及dest所占空間不如src所占空間大。
?*/
char?*strcpy_v2(char?*dest?,?const?char?*src)
{
????char?*d?=?dest;
????char?c;
????
????while((c=*src++)?!=?'\0')
????{
????????*(dest++)=c;
????}
????
????*dest='\0';
????
????return?d;
}

/*
?*?說明:字符串拷貝版本2(你能找出錯誤的原因嗎)
?*?參數:dest目標地址,src源地址
?*?返回:返回拷貝好的地址;如果出錯,無定義
?*?異常:可能出現字符串溢出,及dest所占空間不如src所占空間大。
?*/

?

?

?

總結

以上是生活随笔為你收集整理的C语言字符串拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。