各位看官們,大家好,上一回中咱們說的是字符串查找的例子,這一回咱們說的例子是:字符串初始化函數。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
在定義局部變量的時候,我們需要對字符串進行初始化操作。當然了,手動給字符串初始化是可以的,不過標准庫給我們提供了專門的初始化函數:memset。下面我們來介紹它的用法。
大家可以看到s為void類型的指針,因此,該函數也可以給某個內存區域進行賦值。此外,count經常使用sizeof(type)*n來表示,其中type是s的具體類型,n為數量。這樣可以保證每塊內存區域都能被正確地賦值。
光說不練,不是我們的風格,接下來,我們舉一個實際的例子進行說明:
#define SIZE 16
int main()
{
char str[SIZE]; //定義一個局部變量,不進行初始化操作
printf("The old string is:%s \n",str);
memset(str,'a',SIZE*sizeof(char));
printf("The setted string is:%s \n",str);
return 0;
}
下面是程序運行的結果:
The old string is:-$]??t? //沒有初始化時輸出亂碼
The setted string is:aaaaaaaaaaaaaaaa //初始化後輸出正確的值
從上面的結果中,大家可以看到:字符串初始化前後的輸出內容完全不同。
void *diy_memset(void *s,char c, int n)
下面我們發揚一下DIY的風格,自己定義一個memset函數。
下面是我寫的代碼,請大家參考:
void *diy_memset(void *s,char c, int n)
{
char *p = NULL;
if(NULL == s)
return NULL;
p = s;
while(n>0)
{
*p = c;
p++;
n--;
}
return s;
}
下面是標准庫中memset函數的代碼,請大家和我們DIY的代碼進行比較:
/**
* memset - Fill a region of memory with the given value
* @s: Pointer to the start of the area.
* @c: The byte to fill the area with
* @count: The size of the area.
*
* Do not use memset() to access IO space, use memset_io() instead.
*/
void *memset(void *s, int c, size_t count)
{
char *xs = s;
while (count--)
*xs++ = c;
return s;
}
通過比較,大家可以可以發現,標准庫的代碼更加簡潔一些,不過兩者的賦值思路是相同的。
看官們,正文中就不寫代碼了,詳細的代碼放到了我的資源中,大家可以點擊這裡下載。下面是程序的運行結果,請大家參考:
The old string is:-?_??w? //沒有初始化時輸出亂碼
The setted string is:aaaaaaaaaaaaaaaa //標准庫函數初始化後的結果
The setted string is:bbbbbbbbbbbbbbbb //DIY函數初始化後的結果
各位看官,關於字符串初始化函數的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解。