關於字元型陣列a 20 內空白部分是否為 n

2025-02-05 00:15:16 字數 4052 閱讀 5991

1樓:中華知識鋪子

問題補充的答案]:

樓主看了我之前的,應該知道不用memset可能會出錯。

while(*p==*q)

p--;q++;

這段**由問題。

下面給出一段記憶體中的資料,樓主仔細看看,下面的!還是表示字串結束符號'\0'。

-a---p---q---

fasdg!!sdf!!!abccba!fdseigoadeqw

p,q是指標,看到了嗎?

這時候p和q還是相等的,他們都指向!了。

本來abccba是迴文數,但是p卻指向陣列a前面的地方去了,這。。。豈不是會出大問題。

試試改成這樣:

while(*p==*q)

p--;q++;

if(++p=a)

break;}

答案:memset(a,0,sizeof(a));

作用是把a在記憶體中分配的空間,全部都添上字元'\0'.

也就是說把a[20]得20個空間都添上了'\0'。

如果把abcdefghij這個長度為10得字串給a,那麼。

a得後十個字元還是'\0',而'\0'是字串結束符,這樣確保了讀取記憶體時不會出錯。

即使不用memset函式,絕大多數情況不會出錯。但是有可能會出錯。舉個例子:

假設我們定義了乙個字元傳b[25],在記憶體中儲存如下:

這時候,如果b沒用了,那麼指標b會被刪除,但記憶體中的字串1234567890123456789012345不會消失,就這樣殘留在記憶體中了,不過沒關係,因為沒有任何指標指向這個字串,所以不會出現錯誤。

這就了樓主的另乙個問題,記憶體中的資料永遠是雜亂無章的,你必須自己清空。字串預設只在最後加乙個結束符號,只有乙個,不會多加。

下面給a初始化為abcde,初始化後字串會自動多+乙個結束符號'\0',如下。

aabcde!7890123456789012345

上面的!表示'\0'。

這個時候,用printf輸出a,不會出錯,因為有結束符'\0'

但是,雖然我們只把abcde付給了a,但是a[10]確是有值得,a[10]=1。

這就很容易會弄出錯誤來。

用memset把字串清0,是c語言程式設計序的好習慣。也是保證不會出現記憶體錯誤的基礎。

悉雨辰寂。

2樓:天——天

字元型陣列a[20]內空白部分是'\0'。預設的是空字元(即'\0')

程式修改如下。

while(*p==*q & p!='0')p--;q++;

其餘地方不變,此時去掉memset(a,0,sizeof(a));

不會出錯;

3樓:匿名使用者

不是。字元型陣列a[20]內空白部分是'\0'。

預設的是空字元(即'\0')

c語言中乙個問題,我定義了兩個長度為20的字元陣列,結果我在陣列的時候都超過了字元的陣列的長度了

4樓:網友

c語言是不對陣列是否越界進行檢查的,這個責任全部推給了程式設計者,明顯的壞處是,一旦造成記憶體覆蓋,發生的問題詭異,且難以捉摸,足以讓人抓狂!

5樓:網友

陣列越界大約會造成三種錯誤,1,幸運,什麼錯誤都沒發生。

2,可能會修改自己程式中的某個資料的值。

3,如果在linux下,會發生斷錯誤。

所以陣列越界不是什麼好事。

這三種情況發生的概率不確定,正好的我就發生了1的情況例如以下**。

int n = 10;

printf("n = %d",n);

int arr[3];

arr[3] = 20;//這裡的下標再換大一點,如arr[30],arr[300],arr[3000]..

printf("n = %d",n);

這裡也對應上,上面改成幾就換成幾。

這幾個**放到主函式里試試,就會發生我說的那三種情況。

6樓:潘達

字串是動態陣列,只要初始化就行了,str1=""就能初始化;不需要分配固定記憶體空間。。。在其他語言裡不僅有動態字元陣列,還有動態非字元陣列,都不需要限定長度,這些陣列是通過結束符來判斷長度的,記憶體是動態的,只需要初始化,初始化其實就是給陣列加乙個結束符,以便判斷長度。。。

其實就是並不是所有陣列都需要加[n]這個長度符號的,這只是最早的c語言不識別動態陣列才特意加的(現在的c語言也不支援動態陣列,只支援字元陣列),動態陣列的壞處就是可能佔用其他變數記憶體,但這個在其他語言裡編譯器替你解決,不需要你操心,c語言不會判定越界。。。

編寫程式,輸入兩個字串存入陣列a和陣列b中,判斷陣列b中字串是否在陣列a字串**現(稱為子串)。

7樓:網友

#include

#define maxline 100

int strindex(char source[ ]char searchfor[ ]

char pattern ould"; 要查詢的模式*//* 找出所有與模式匹配的行*/

int main (void)

int i = 0;

while (line[i])

if ( strindex(line[i++]pattern) >0 )

elseprintf ("no");

return 0;

strindex:返回t在s中的位置,若未找到則返回-1 */int strindex(char s,char treturn -1;

用c++程式設計:將字元陣列b中的所有內容複製到陣列a中

8樓:網友

不使用strcpy有沒有說不使用memcpy memcpy可以是一樣的效果。

只要知道兩個陣列的大小,被複制的陣列要小於或等於需要複製的陣列大小不使用memcpy

就只有乙個字元的複製。

int i = 0;

while(b[i])

字串和字元陣列

9樓:

陣列初始化。

int a[10] = ;

只給出a[0] ,a[1],a[2]的值 則編譯器把a[3] ~a[9]全賦值為0

同理char str[10]=;

後面沒指定的元素 值為0 ,而 字串結束標誌 '\0' 的ascii為0

所以這樣就有結束標誌 '\0'

char name[20]是陣列還是字串?

10樓:

char name[20]是 char 陣列。

它存放的內碰碼搭容可以看成 1 byte 的 char 型陣列元素笑拿模告,或 1 byte 的 整型 陣列元素。

初始化: char name[20]="abcd_1234";

語句:strcpy(name,"abcd_1234");

語句:for (i=0;i<4;i++)name[i] =a' +i;

name[4]='

for (i=5;i<8;i++)name[i] =1' +i -5;

語句:printf("%s",name);

11樓:網友

字串,就是乙個字元的陣列組成的。

字元陣列*a與a

12樓:網友

lz是覺得 a應該等於a[0]對嗎?

其實不然,這個例子中a[0]就是'y'這個字元,a[0]是乙個變數而已。

a是指標,也就是a[0]的位址,所以說 a等價於&(a[0])而不是a等價於a[0]

而*a才是等價於a[0]

13樓:網友

%c 是得 printf函式直接把 a所帶表的位址值轉換成字元資料並輸出 你是不是應該用 %s 啊。

a[0] 是char 資料 a是指標資料。

14樓:網友

*a=*(a+0)=a[0] 即『y』

而a代表的是a這個陣列的起始位址。

c 類裡定義的字元型陣列const char a

有多種方式可以賦值。1 宣告和初始化同時進行,例如 const char a 5 2 把它看成字串,用636f707962616964757a686964616f31333337616535 strcpy 賦值,例如 strcpy a,abcde 3 用 memcpy 把另一個陣列裡的值傳給它 me...

c 中怎樣判斷兩個字元型陣列元素相等

直接用c 庫函式strcmp char a,char b 就可以比較出兩字串是否相等,對於字元型陣列也是一樣的,只要分別帶入陣列地址就可以了。函式返回0 表示相等 大於0表示字串a大於字串b 反之小於則串a小於b。而這裡的庫函式做的比較是一次比較字串中相同位置的單個字元的ascii得出的結果。你也可...

有字元陣列,每元素都是字串,如何獲得每字串的長度

取得的字元陣列長度與使用的獲取長度的方法有關,在c c 中常用的獲取字串長度或者字串陣列長度的函式有sizeof strlen sizeof 求出的是陣列的總長度,而不是陣列中存放的有意義的資料的個數。比如定義一個int型的陣列 int a 10 只初始化了五個元素,但是 sizeof a size...