c語言程式設計題,關於sizeof。具體是怎麼來的?如果是str

2022-03-02 08:15:41 字數 7265 閱讀 4268

1樓:匿名使用者

sizeof()是單目運算子,功能是返回括號內那貨佔用的位元組數。

括號內是char s,陣列,佔用位元組數取決於初始化時賦值的內容。

初始化賦值的內容是"\123\\100a\t"

下面要說的,你最好比對著課本來看。

關於字元,有兩種表示形式,普通形式(例如'a'),還有轉義字元形式。

轉義字元是由前導和字尾組成。

前導是\,表示後續跟進內容意義反轉,不做常規解釋;字尾就是後續跟進的內容。

轉義字元的字尾,允許由特殊字母和普通數值(只允許八進位制和十六進位制)組成。

'\n'是最常見的由特殊字元組成的轉義字元。

由於字元表示中,單引號、雙引號、反斜槓意義特殊,要正常表示這三種字元,必須再次新增反斜槓字首,也就是對應'\'','\"','\\'

而數值跟進的,\之後直接跟著數值,說明是八進位制資料,最長允許3位合法的八進位制資料(例如'\35');若是\之後緊跟x,就表示是十六進位制,最長允許2位合法十六進位制資料。

舉例:"12\789\x123\09654"

開頭1和2是2個普通字元;

之後\緊跟陣列,允許至多三個合法八進位制,八進位制範圍0-7,所以只能取\7,這是第3個字元;

89是第4、5個字元;

\x十六進位制,至多2個合法十六進位制,所以取\x12,這是第6個

3是第7個;

再往後,不用細說了,第8個是\0。

由於\0是字串結束標誌,所以字串就此截止,後續內容不予考慮。

你這道題目,我用空格給你間隔一下就行了

\123 \\ 1 0 0 a \t 這是字串的組成內容,一共7個。

但是,上面說了,字串的結束標誌是\0,不管寫沒寫,\0一定存在。

所以,題目中給定的字串s,由8個字元組成,答案是8

至於你問的strlen函式,求字串長度的。字串長度不計算空字元,但空字元佔用記憶體空間,可以機械性的記憶成長度=位元組數-1

2樓:斌——霜

sizeof只計算型別的大小,比如char是一個字元,int是四個字元(32位)等等,不過指標永遠都是四個字元。那個strlen只計算字串的大小。對於sizeof和strlen的區別是strlen不會算最後一個"\0",而sizeof會算的。

不知道這樣解答你明白了麼

3樓:匿名使用者

sizeof是指變數佔的記憶體的大小,strlen是指字串的長度char a[10]="1234";

sizeof(a)=10;

strlen(a)=4;

在c語言求字元長度的問題,strlen與sizeof怎麼計算出來的長度不是我們理解的那樣?

4樓:匿名使用者

sizeof(p)計算的是p變數的

bai大小du

zhi由於p是指標,p的大小就是4位元組dao,它不是求內容的長度,

5樓:匿名使用者

strlen獲取字串bai的長度。

每個中文du字元佔用zhi兩個位元組,所以dao中國是strlen是2+2=4;

英文字元儲存一版個位元組,故

權zg是1+1=2

sizeof用於求取佔用的空間。

但是注意,你求取的物件不是字串本身,而是變數本身。p和q兩個變數均為指標,指標在計算機中佔用4個位元組,所以最後兩個都是4.

6樓:匿名使用者

strlen的結果是bai

正確的,而dusizeof是在編譯的時候處理的,zhi這個dao時候編譯專器還不知道你這個指標指向的內容呢,因為你屬這個指標指向中國,是在執行的時候才處理的,好好想想,就是sizeof是在編譯的時候就已經算出結果了,不管你程式執行的時候指向**,它都是那個值。如果你寫sizeof(」中國」)那結果就是5了

以上純屬手打,望採納

c語言中sizeof和strlen的問題

7樓:匿名使用者

strlen是測試字串長度的函式,測試的值為字串中的實際長度(不包括'\0')。

sizeof的作用就是返回一個物件或者型別所佔的記憶體位元組數。一個字元佔一個位元組,a、b各佔一個,還有一個'\0',所以是3。

至於這個為什麼是五,因為賦給字元陣列的初值如果個數小於陣列的長度,其餘未賦值的元素自動定為空字元即'\0'

8樓:匿名使用者

2個意義不一樣的。

strlen 是函式。引數為 chan*, 專門針對字串的。

sizeof 是運算子,不是函式,可以這樣寫sizeof a, 等等。

strlen求字串的長度,不含字串結束標誌。因此strlen(a) == 3

sizeof求的是編譯器為陣列放分配的空間大小,一旦 char a[5] 定義了,則就會分配5個位元組的空間。

9樓:匿名使用者

樓主以後請別要用char a[5]="abc"這種用法。

因為基本沒人這麼用。當然這確實是給字元陣列賦初值的最快方法。

好的 你的認為4其實是不對的。

上面的char a="ab"不顯示宣告下標,那麼編譯器會根據需要取最小的需求滿足。

字串"ab"在記憶體中的表示是 a的ascii碼 b的ascii碼 \0

因為c/c++以\0為字串的結束符,所以\0是隱式的字元那麼這裡編譯器就把a自動宣告成3個下標的陣列了char a[ ]="ab";

和char a[3]="ab";

等效char a[2]="ab";就是錯誤的,因為放不下char a[4]="ab";就會最後一個下標的位置沒有資料,浪費了。

那一個陣列的下標是3,sizeof自然是3啦

10樓:閒談職乎哲也

sizeof(陣列名),得到的是這個陣列所佔的位元組數。

char a[ ]="ab"; 這樣的賦值方法,使得陣列的大小就是字串的大小;而」ab「是一個字串,字串是以'\0'結尾的,所以這個字串有3個字元,也就是說,陣列a有3個位元組的大小,所以是3了。

11樓:雨中抬頭

基礎太不紮實了!a[5]是陣列好不好?sizeof(a)當然= 5,strlen(a)= 3不用解釋了吧~char a[ ]="ab";

沒有定義陣列長度,系統會根據實際賦值的陣列大小來確定!當然就有sizeof(a)=2了

12樓:數學教輔資料

strlen(a)是求的該陣列的元素個數所以當a[ ]="ab"時,strlen(a)的結果是2;sizeof(a)是求陣列佔的空間的,當a[ ]="ab"時,它實際的空間就是3,因為最後還有自帶的一個結束符,也佔用一個空間。比如a="asdf",那麼sizeof(a)的結果就是5而不是4。

c語言中sizeof與strlen的區別是什麼

13樓:匿名使用者

一、指代不同

1、sizeof:用於獲取字串的長度,是處理字串的重要工具。

2、strlen:所作的是一個計數器的工作。

二、規則不同

1、sizeof:可用於任何變數名、型別名或常量值,當用於變數名(不是陣列名)或常量時,不需要用圓括號。

2、strlen:從記憶體的某個位置(可以是字串開頭,中間某個位置,甚至是某個不確定的記憶體區域)開始掃描,直到碰到第一個字串結束符'\0'為止,然後返回計數器值。

三、用法不同

1、sizeof:sizeof( type_name ); // sizeof( 型別 );編譯時起作用,而不是執行時。

2、strlen:extern unsigned int strlen(char *s);返回s的長度,不包括結束符null。

14樓:小丁創業

區別如下:

1、指代上的區別

(1)sizeof:用來獲取字串長度的導引,是處理字串的重要工具。

(2)strlen:做的是一個計數器。

2、用法上的區別

(1)sizeof:sizeof( type_name ); // sizeof(type); 在編譯時有效,而不是在執行時有效。

(2)strlen:extern unsigned int strlen(char *s); 返回s的長度,不包含終止符null。

3、規則上的區別

(1)sizeof:可用於任何變數名,型別名或常量值。 當用於變數名(不是陣列名)或常量時,不需要括號。

(2)strlen:從記憶體的某個特定位置開始掃描(可以是字串的開頭,中間的某個位置,甚至是不確定的儲存區域),直到第一個字串結束字元'\ 0'為止 ,然後返回計數器值。

15樓:小可

strlen(char*)函式求的是字串的實際長度,它求得方法是從開始到遇到第一個'\0',如果你只定義沒有給它賦初值,這個結果是不定的,它會從aa首地址一直找下去,直到遇到'\0'停止。

char aa[10];cout<>>> strlen 計算字串的長度,以結束符 0x00 為字串結束。

int b=sizeof(str); //而b=20; >>>> sizeof 計算的則是分配的陣列 str[20] 所佔的記憶體空間的大小,不受裡面儲存的內容改變。

上面是對靜態陣列處理的結果,如果是對指標,結果就不一樣了

char* ss = "0123456789";

sizeof(ss) 結果 4 ===》ss是指向字串常量的字元指標,sizeof 獲得的是一個指標的之所佔的空間,應該是

長整型的,所以是4

sizeof(*ss) 結果 1 ===》*ss是第一個字元 其實就是獲得了字串的第一位'0' 所佔的記憶體空間,是char類

型的,佔了 1 位

strlen(ss)= 10 >>>> 如果要獲得這個字串的長度,則一定要使用 strlen

sizeof返回物件所佔用的位元組大小. //正確

strlen返回字元個數. //正確

在使用sizeof時,有一個很特別的情況,就是陣列名到指標蛻變,

char array[3] = ;

sizeof(array) == 3;

char *p = array;

strlen(p) == 1;//sizeof(p)結果為4

在傳遞一個陣列名到一個函式中時,它會完全退化為一個指標

看完以上你是否很清楚sizeof和strlen的區別了呢?還不明白的話,我們看下面幾個例子:

第一個例子

char* ss = "0123456789";

sizeof(ss) 結果 4 ===》ss是指向字串常量的字元指標

sizeof(*ss) 結果 1 ===》*ss是第一個字元

大部分編譯程式 在編譯的時候就把sizeof計算過了 是型別或是變數的長度

這就是sizeof(x)可以用來定義陣列維數的原因

char str[20]="0123456789";

int a=strlen(str); //a=10;

int b=sizeof(str); //而b=20;

大部分編譯程式 在編譯的時候就把sizeof計算過了 是型別或是變數的長度

這就是sizeof(x)可以用來定義陣列維數的原因

char str[20]="0123456789";

int a=strlen(str); //a=10;

int b=sizeof(str); //而b=20;

char ss = "0123456789";

sizeof(ss) 結果 11 ===》ss是陣列,計算到\0位置,因此是10+1

sizeof(*ss) 結果 1 ===》*ss是第一個字元

char ss[100] = "0123456789";

sizeof(ss) 結果是100 ===》ss表示在記憶體中的大小 100×1

strlen(ss) 結果是10 ===》strlen是個函式內部實現是用一個迴圈計算到\0為止之前

int ss[100] = "0123456789";

sizeof(ss) 結果 400 ===》ss表示在記憶體中的大小 100×4

strlen(ss) 錯誤 ===》strlen的引數只能是char* 且必須是以'\0'結尾的

char q="abc";

char p="a\n";

sizeof(q),sizeof(p),strlen(q),strlen(p);

結果是 4 3 3 2

第三個例子

char szpath[max_path]

如果在函式內這樣定義,那麼sizeof(szpath)將會是max_path,但是將szpath作為虛參宣告時(void fun(char szpath[max_path])),sizeof(szpath)卻會是4(指標大小)

子char szpath[max_path]

如果在函式內這樣定義,那麼sizeof(szpath)將會是max_path,但是將szpath作為虛參宣告時(void fun(char szpath[max_path])),sizeof(szpath)卻會是4(指標大小)

還有一位網友的說明也很好:

其實理解 sizeof 只需要抓住一個要點:棧

程式儲存分佈有三個區域:棧、靜態和動態。能夠從**直接操作的物件,包括任何型別的變數、指標,都是在棧上的;動態和靜態儲存區是靠棧上的所有指標間接操作的。

sizeof 操作符,計算的是物件在棧上的投影體積;記住這個就很多東西都很清楚了。

char const * static_string = "hello";

sizeof(static_string) 是 sizeof 一個指標,所以在 32bit system 是 4

char stack_string = "hello";

sizeof(stack_string) 是 sizeof 一個陣列,所以是 6 * sizeof(char)

char * string = new char[6];

strncpy(string, "hello", 6");

sizeof(string) 是 sizeof 一個指標,所以還是 4。和第一個不同的是,這個指標指向了動態儲存區而不是靜態儲存區。

不管指標指向的內容在什麼地方,sizeof 得到的都是指標的棧大小

c++ 中對引用的處理比較特殊;sizeof 一個引用得到的結果是 sizeof 一個被引用的物件的大小;所以

struct o

;int main()

r 引用的是整個的 o 物件而不是指向 o 的指標,所以 sizeof r 的結果和 sizeof o 完全相同。

C語言程式設計題,求助大神,C語言程式程式設計題,求助大神

int fun int x int fun int x if x x count x return 0 樓上的都會不會看題?include int fun int x while xx i return 0 int main int argc,const char const argv return...

c語言程式設計題求幫忙,C語言程式設計題,求12!3!20!的和,怎麼做

是初學者嗎 這樣的問題最好說明哪一步不懂,自己練習還是最重要的scanf一位一位的讀入 乘除之後,switch case就ok了 include int main void char s 20 10x98765432 char id 20 int sum 0,i,yushu printf 請輸入身份...

C語言程式設計題,求助大佬解答,C語言程式設計題,求助大佬解答

題目是不是出錯了,應該是使用指標對有序陣列進行插入和排序吧,使用連結串列?這個怎麼理解?c語言程式設計題讀取時間求助,謝大佬了!字元轉整形抄的簡單應 bai用du 使用到頭文zhi件 math.h。例如dao void timeget const mytime time,int hour,int m...