對于C語言來說,字符串其實就是最后一個元素為’\0’的char數組
字符數組的初始化
字符數組常見的有兩種初始化方式
char str[] = "hello";
或者
char str[] = {'h', 'e', 'l', 'l', 'o'};
當使用sizeof(str)時,得到的大小為6,此時是算上了’\0’的。
如果不指定數組長度的初始化,末尾加上’\0’,否賊輸出長度未知
char str[] = {'a', 'b', 'c', '\0'};//這種初始化末尾需要加上'\0'
char str[] = "abc";//這種初始化不需要加上'\0'
字符串可以存放在堆區,棧區和常量區
緩沖區溢出
char arr[3] = {0};
scanf(%s, arr);
//當輸入長度大于2,會溢出
如果輸入的字符大于字符數組的長度,會造成緩沖區溢出
scanf會以空格作為分隔符
字符串處理函數
gets
從輸入設備獲取輸入字符串
gets不會檢查預留緩沖區是否可容納輸入數據,沒有解決緩沖區溢出問題
fgets
fgets用于讀取文件,也可從鍵盤讀取,此時要使用stdin。fgets會截取長度符合輸入指定
char s[100] = { 0 };
fgets(s, sizeof(s), stdin);
puts
puts函數打印字符串,與printf不同,puts會在最后自動添加一個’\n’
char s[] = "hello"
puts(s);
fputs
fputs是puts的文件操作版本,也不會輸出多余的’\n’
char s[] = "hello";
fputs(s, stdout);
strlen,字符串長度
strlen返回字符串長度,不包含’\0’
strlen(arr);
strcat,字符串追加
strcat(a,b);
實現:
int len_a = strlen(a);
int len_b = strlen(b);
for ( int i = len_a; i < len_a + len_b; i++)
{a[i] = b[i - lena];
}
strncat,字符串有限追加
strncat(a, b, sizeof(a) - strlen(a) - 1);
strcmp,字符串比較
如果相同返回0
strcmp(a, b);
strncmp,字符串有限比較
只要指定長度內相同,則返回0
strncmp(a, "str", 3);
strcpy字符串拷貝
把b拷貝到a
strcpy(a, b);
strncpy字符串有限拷貝
防止拷貝越界
sprintf,格式化字符串
向char數組輸出一個字符串,其他行為和printf一模一樣
sprintf(a, "this is a %d", 10);
strchr查找字符
返回一個位置的指針,如果沒找到,返回NULL
char *c = strchr(a, 'b');
strstr查找子串
char *c = strstr(a, "abc");
strtok分割字符串
字符在第一次調用時strtok()必需給予參數s字符串,往后的調用則將參數s設置成NULL每次調用成功則返回指向被分割出片段的指針
char buf[] = "abc@defg@igk";
char *p = strtok(buf, "@");;
while (p)
{printf("%s\n", p);p = strtok(NULL, "@");
}
atoi轉化為int
將字符串整數轉化為整數
atoi(buf);
atof轉化為float
將字符串整數轉化為單精度浮點數
atof(buf);
atol轉化為long
將字符串整數轉化為long類型
atol(buf);