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...