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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

c语言字符串详细

發布時間:2024/4/18 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言字符串详细 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.字符串字面量。

"Candy \nIs dandy \nBut liquor \nIs quicker."

在c++中叫字符串字面值.可以在字符串內embed轉移序列,例如'\n'

謹慎在字符串中embed八進制和hex轉移序列,八進制轉移序列以/開始,十六進制轉移序列以/x(x必須小寫)開始,八進制轉移序列在三個數字(必須0~7范圍內)之后結束或者以第一個非八進制以內的數字結束(數字大于等于8就結束)。

十六進制/x后面沒有限制,以第一個非十六進制數字(大于f)結束。注意十六進制的數字大小寫均可(從編譯器運行結果得到)。例如看下面代碼:

#include <stdio.h> int main() { if(('\xAA') == ('\xaa'))printf("equal"); else printf("not equal.");return 0; }

運行結果是:

equal

2.延續字符串字面值。

(1)方法1:采用 \

例如?? "i am a student?? \

?? and you are a teacher. "

特點:第一行以\(不包含)處結束,第二行以行首開始。

(2)方法2:當兩條或者多條字符串相鄰時候,c語言會自動合并字符串。利用這個規律可以這樣書寫

"i am a student? "

" and you are a teacher. "

最后編譯器會自己把字符串合并成。"i am a student?? and you are a teacher. "

3.字符串字面量的存儲。c語言把字符串字面量當成字符數組來存儲的。當c語言遇到長度為n的字符串,那么它會為字符串字面量分配長度n+1的內存空間,末尾加'\0'。注意:這里不要混淆'\0'、'0'、'? ',空字符的碼值為0,而'0'的碼值(ASCII)為48,空格'? ' ASCll碼值是32。切記,如果字符數組默認初始化,那么就是' \0'.

字符數組默認初始化時候,每個字符也是賦值'\0'而不是空格鍵,算術類型數組初始化每個數字都是0.

空字符串是"",空字符串作為單獨的一個空字符存儲,'\0'

字符串字面之是當成數組來存儲的,所以字符串字面之會被當成是指針(數組名字會被當成指針).例如,printf("abcde");那么會傳遞給printf函數字符串"abcde"的地址(即指向字符a的內存單元的指針).

4.字符串字面值會被當成是指針。

例如 "abc"

printf("abc");這里“abc”會被當成是指針,指向字母a的內存單元。

printf 和scanf 都接受char *類型作為他的第一個參數。

5.字符串字面值的操作。

(1)字符串字面值不能更改。看下面的代碼:

#include <stdio.h> int main() { char *str = "abcde"; *str = 'a'; printf("%s",str);return 0; }

運行結果發生運行時錯誤:

r@r:~/coml_/c/13/2$ gcc 3.c -o 123 r@r:~/coml_/c/13/2$ ./123 Segmentation fault (core dumped) r@r:~/coml_/c/13/2$

結論:不能更改字符串字面值的內容。但是可以使char *對象指向別的字符串,例如,

#include <stdio.h> int main() { char *str = "abcde"; printf("%s\n",str); //str 重新指向另一個字符串字面量 str = "efghikasdfasd fasdf asdf asdf asf"; printf("%s",str); return 0;

運行結果如下:

abcde efghikasdfasd fasdf asdf asdf asfr

意外的地方:還能超過原來字符串的長度。

(2)一半情況下,可以在需要char *的任何地方使用字符串字面值。

例如,char *p;

p = "abc";這個操作不是拷貝字符串,是把字符a的地址賦值給p,也就是說指針變量p的賦值過程,而不是字符串整體的賦值過程。

(3)指針有下標操作,字符串字面值也有

"abc"[1],指的是字符b

如下函數,把整數轉換成十六進制字符的形式。

char number_to_hex(int n) { return "0123456789ABCDEF" }

(4)這里注意十六進制和八進制轉移序列是不一樣的

????????? (a)十六進制數的定義\x00(x大寫小寫都可以,數字部分沒有長度要求),八進制數的定義,\012(數字0開頭就是八進制數,\0后面的數字也沒有長度限制

???????? (b)十六進制轉義序列必須\x開頭(x必須小寫,而且后面數字部分最多2位從0~ff),八進制轉移序列\開頭,后面數字最多3位,看下面的圖也能復習下

6.字符串字面值和字符常量不能互換,看下面的代碼:

#include <stdio.h> int main() { printf("\n"); printf('\n'); //這里引發錯誤return 0; }

gcc編譯器編譯結果如下:

r@r:~/coml_/c/13/2$ gcc 4.c -o 123 4.c: In function ‘main’: 4.c:5:8: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion]5 | printf('\n');| ^~~~| || int In file included from 4.c:1: /usr/include/stdio.h:332:43: note: expected ‘const char * restrict’ but argument is of type ‘int’332 | extern int printf (const char *__restrict __format, ...);| ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ 4.c:5:1: warning: format not a string literal and no format arguments [-Wformat-security]5 | printf('\n');

7.字符串變量。注意必須以“\0”結尾,否則庫函數調用它會出現未定義的行為。

#include <stdio.h> #define STR_LEN 20 int main() { //方法1:直接定義成字符數組+初始化 char str[STR_LEN + 1] = "you are welcome."; //方法2:直接定義為char * + 初始化 char * str1 = "you are welcome."; //方法3:先定義一個字符數組,和一個char *,把char *對象指向一個char 數組 char str2[STR_LEN + 1],*str3; str3 = str2; //方法4:先定義一個char *,后來可以指向一個字符串字面值 char *ptr; ptr = "you are welcome"; puts(ptr);return 0; }

但是如果要使用scanf讀入char*,則必須先開辟足夠空間,也就是,必須先聲明為 char [STR_LEN + 1]類型,而不能申明為char *類型。

char *p;? //僅僅給指針p開辟了足夠存放一個指針的空間.而不能給字符串分配空間。如果利用p讀入,會引發錯誤:

#include <stdio.h> int main() { char *p; scanf("%s",p); printf("%s",p);return 0; }

運行結果如下:按照要求輸入了? you aresdf后,輸出確是null

you arasdf (null)

8.初始化字符串變量

c語言處理數組初始化式的時候,當數組初始化式被數組本身短的時候,余下的數組元素會被初始化為0(元素是int,float,double的情況),char 數組遵守同樣的規則,會以'\0'補充。

不論給char *,或者給char []類型賦值(值類型是字符串字面量),那么都會自動在結束時候以'\0'補充

#include <stdio.h> int main() { double d[12] = {0.0}; int i; for(i = 0; i!= 12; ++i) { printf("%f\n",d[i]); }return 0; } ~

運行結果如下:

0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000

9.字符數組和字符指針

相同點:任何接受字符數組或者字符指針的地方,這兩個都可以作實際參數。

不同點:

(1)字符數組可以修改某個字符的值,而字符指針不能修改字符串字面值。

(2)字符數組的名字是數組名,而字符指針是變量,可以在執行的時候指向其他字符串。

例如,char *p,這里p是一個指針變量,指向char對象。p的值是可以改變的,僅僅如此(p指向的對象的不能改變,區分*p = ...(不合法), 和p = ...(合法))

char *p;

p = "abcde";//合法,這里更改的是p的值。p是一個變量,當然可以更改了。

*p = "efghi";//不合法,這里要改變p指向的那個字符串字面量,會報錯。

?

10.字符串的讀寫

(1)讀

利用scanf或者fget();

特點:會忽略開始的后面的一切空白,例如輸入?? a?? bc def,那么會忽略開始的空格,最后把a讀入,后面的一些在內存中緩存,等待后續需要讀入的時候。

(2)寫

???????????????? printf("")會嚴格一個一個地輸出,直到遇到第一個'\0'為止,如果字符串末尾沒有'\0',會繼續寫出,直到遇到內存中的第一個'\0'為止。

??????????????? puts(),會在行末直接加一個'\n'(自動換行)

(3)自己編寫讀取字符串函數要解決的問題如下

?? (a)什么時候開始讀取(是否忽略開始的空白字符)(b)怎么結束’\n’,空格還是某個字符,結束字符是否要寫入字符串? (c)如果讀取的字符串太長,那么多余的字符直接忽,還是把它留給下一次的輸入操作。

例如,不忽略換行符,在第一個換行符結束,且換行符不存在字符串中,則如下編寫,代碼中的函數read():

#include <stdio.h> #define LEN 20 int read(char str[],int n); void print(char str[],int n); int main() { char array[LEN + 1] = {' '}; read(array,LEN); print(array,LEN+1);return 0; } int read(char str[],int n) { char ch; char *p = str; int i = 0; while((ch = getchar()) != '\n') {if(i < n){ *p ++ = ch;i++;} } *p = '\0'; return i;} void print(char str[],int n) { int i = 0; for(i = 0; i!= n; ++i){printf("%c",str[i]);} }

?????????????????? 函數read()也可以如下簡單的編寫:

int read(char str[],int n) {int i = 0; char ch;while((ch = getchar()) != '\n'){if(i < n)str[i ++] = ch;}str[i] = '\0'; //terminates stringreturn i; //number of characters stored }

scanf函數和gets函數會在末尾自動加空字符,然而,自己編寫函數要自己添加空字符。

?

?

?

?

?

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

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

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

主站蜘蛛池模板: av在线不卡观看 | 六月丁香啪啪 | 综合色亚洲 | 日韩丝袜一区 | 丁香综合激情 | 国产精品亚洲天堂 | 黄色18网站| 午夜精品免费视频 | 亚洲精品国产成人无码 | 免费观看的黄色网址 | 成年人高清视频 | 少妇高清精品毛片在线视频 | 国产精品7777 | 亚洲男人天堂电影 | 在线观看av黄色 | 国产一区二区三区在线免费 | 亚洲精品a级 | 日韩毛片一区二区三区 | 草草免费视频 | 精品小视频 | 亚洲高清毛片一区二区 | 精品一区二区亚洲 | 六月色丁香 | 天堂网中文 | 九热在线视频 | 四虎影院一区二区 | 国产精品不卡在线观看 | 蜜桃又黄又粗又爽av免 | free性欧美hd另类 | 国产v片 | 免费在线国产精品 | 亚洲成人免费 | 伊人色在线 | 午夜操操 | 日本人毛片 | 亚洲AV无码乱码国产精品色欲 | av鲁丝一区鲁丝二区鲁丝三区 | 日日爽| 日韩大片在线观看 | 嫩草亚洲 | 91黄色免费看| 轮番上阵免费观看在线电影 | 丰满少妇一区二区三区专区 | 欧美性视频播放 | 自拍一级片| cao死你 | 欧美六区 | 亚洲av综合色区无码一区爱av | 99国产精品一区二区三区 | 国产人妻人伦精品1国产 | 亚洲最大综合网 | 性少妇mdms丰满hdfilm | 亚洲美女色视频 | 亚洲影视在线 | 娇妻玩4p被三个男人伺候电影 | 国产精品白虎 | 双性高h1v1 | www.色网站 | 中文字幕一区2区3区 | 粉嫩av在线播放 | 人妻丰满熟妇岳av无码区hd | 一区二区福利视频 | 成人激情视频 | 日本一道在线 | 看一级黄色 | 无人在线观看高清视频 单曲 | 巨乳在线播放 | 国产一区二区三区电影在线观看 | 精品中出 | 男人靠女人免费视频网站 | 日本高清视频www夜色资源 | 综合久 | 亚洲成熟少妇视频在线观看 | 亚洲精品一二 | 亚洲天堂小说 | 国产精品久久久久久人妻精品动漫 | 伊人色在线 | 懂色av一区二区三区 | 麻豆av免费在线观看 | 色91精品久久久久久久久 | 99福利视频| 欧美久久一区二区三区 | 免费av一区二区三区 | 肉色欧美久久久久久久免费看 | 黄色美女视频网站 | 懂色av一区二区三区四区五区 | jizzjizz黄大片 | 久久亚洲AV成人无码国产人妖 | 中文字幕免费在线看线人 | 成人资源站| 制服.丝袜.亚洲.另类.中文 | 亚洲熟妇av一区二区三区 | 在线观看欧美亚洲 | 国产人成一区二区三区影院 | 91娇羞白丝网站 | 国产精成人品免费观看 | 午夜精品久久久久久久久久久 | 成人网址在线观看 | 日韩欧美精品在线视频 |