C语言 复制字符串
#include <stdio.h>
#define LENGTH 128char* str_copy(char *p, const char *s){char *t = p;while (*p++ = *s++){}return t;
}int main(void){char str[LENGTH] = "";char tmp[LENGTH];printf("str = \"%s\"\n", str);puts("請輸入要復制的字符串:");scanf("%s", tmp);str_copy(str, tmp);puts("將 tmp 復制給 str 后:");printf("str = \"%s\"\n", str);return 0;
}
str_copy(str, tmp); puts("將 tmp 復制給 str 后:"); printf("str = \"%s\"\n", str);
#include <stdio.h>
#include <string.h>int main(void){char str[] = "";char *p = "vvcat";printf("復制后str = \"%s\"", strcpy(str, p));return 0;
}
#include <stdio.h>
#include <string.h>int main(void){char str[] = "";char *p = "vvcat";printf("復制后str = \"%s\"", strncpy(str, p, 4));return 0;
}
運行結果:
- 通過 *p = *s 進行賦值
首先進行的是 *p = *s 的賦值。指針 s 指向的字符會被賦值給指針 d 指向的字符。 - 指針 p 和 s 遞增
賦值結束后, p 和 s 遞增。指針 p 和 s 分別指向了下一個字符。
函數開始執行時,指針 s 指向字符串 tmp 的第一個字符,指針 p 指向字符串 str 的第一個字符串。 - 只要 s 指向的字符不是 null 字符,就將 s 指向的字符賦給 p 指向的字符,然后使 p 和 s 遞增,再處理下一個字符。
當賦給 *p 的字符為 null 字符時,while語句的循環就結束了。
也可將str_copy 函數
char* str_copy(char *p, const char *s){char *t = p;while (*p++ = *s++){}return t; }換成如下函數
char* str_copy(char *p, const char *s){int i = 0;char *t = p;while (p[i] = s[i]){i++;}return t; }p[i] 和 s[i] 分別是 *(p + i) 和 * (s + i),即訪問指針p 和 s 所指向的字符之后第 i 個字符的表達式。為了訪問指針所指元素后第 i 個字符,分別對指針 p 和 s 進行了兩種運算。
兩個函數進行對比
while (*p++ = *s++)- 不需要用于下標的變量 i ,可以節約少量內存。
- 運行效率有望更高。
如果將
char str[LENGTH] = "";換成
char *str = "";會導致程序運行異常。
注:
不要改寫字符串字面量,也不要對超過字符串字面量的內存空間進行寫入操作。
str_copy(str, tmp); puts("將 tmp 復制給 str 后:"); printf("str = \"%s\"\n", str);
可以簡寫成:
puts("將 tmp 復制給 str 后:"); printf("str = \"%s\"\n", str_copy(str, tmp));首先將字符串 tmp 復制到字符串 str,然后再將復制后的 str 顯示出來。
傳入printf 函數的正是“指向復制后的字符串的第一個字符的指針”。
使用strcpy函數復制字符串
| #include<string.h> | char *strcpy(char *s1, const char *s2) | 將s2指向的字符串復制到s1指向的數組中。若s1和s2指向的內存空間重疊,則作未定義處理。 | 返回s1的值。 |
strcpy函數的實現
char *strcpy(char *s1, const char *s2){char *tmp = s1;while (*s1++ = *s2++){}return tmp; }strncpy函數控制字符串復制的個數
| #include<string.h> | char *strncpy(char *s1, const char *s2, size_t n) | 將s2指向的字符串復制到s1指向的數組中。若s2的長度大于等于n,則復制到第n個字符為止。否則用null字符填充剩余部分。若s1和s2指向的內存空間重疊,則作未定義處理。 | 返回s1的值。 |
運行結果:
strncpy函數的實現
char *strncpy(char *s1, const char *s2, size_t n){char *tmp = s1;while (n){if (!(*s1++ = *s2++)){break;}n--;}while (n--){*s1++ = '\0';}return tmp;}總結
- 上一篇: C语言 字符串和指针
- 下一篇: C语言 字符串转换成int、long和d