本帖最後由 EITCo 於 2018-12-22 17:16 編輯
你可能寫慣其他更高階的語言,有得就咁 cat = str_a + str_b
C相對較低階,無咁直覺,資料的格式同運算都更貼近硬件層面
C的string其實只係char[],所以concat string其實即係concat array
如果擺脫唔到既有 str_a + str_b 的諗法
可以想像依家係做緊concat int[]- int a[6] = { 0, 10, 20 };
- int b[] = { 30, 40, 50 };
- int a_len = 3, b_len = 3, i;
- for (i = 0; i < b_len; i++) {
- a[a_len + i] = b[i];
- }
複製代碼 strcat(dest, src) 係將src駁係dest後面
以上都先寫左將b駁係a後面的版本
然後轉返做char[]
另外string有最尾的 '\0' 要注意
而string長度如果唔用strlen,亦係靠數 '\0' 係第幾個char- char *my_strcat(char *dest, const char *src) {
- // Find length of dest
- // Can also use strlen(dest)
- int dest_len = 0;
- while (dest[dest_len] != '\0') {
- dest_len++;
- }
- // At this point, dest[dest_len] == '\0'
- // It will be overriden by src[0] in the below loop
- int i;
- for (i = 0; src[i] != '\0'; i++) {
- dest[dest_len + i] = src[i];
- }
- // Put null char at the new end of dest
- dest[dest_len + i] = '\0';
- return dest;
- }
複製代碼 如果了解pointer,其實用pointer取代array[index]的寫法仲簡潔
另外以下省略左啲 != '\0'- char *my_strcat_2(char *dest, const char *src) {
- char *char_p = dest;
- while (*char_p) {
- char_p++;
- }
- while (*src) {
- *char_p++ = *src++;
- }
- *char_p = '\0';
- return dest;
- }
複製代碼 最後如果要唔改動輸入的兩條strings,另造一條新的,就要用malloc
而上面第7至10行需要用兩次,所以寫個function (其實即係strcpy)- char *my_strcpy(char *dest, const char* src) {
- while (*src) {
- *dest++ = *src++;
- }
- *dest = '\0';
- return dest;
- }
- char *my_alloc_strcat(char *head, char *tail) {
- int head_len = strlen(head);
- char *concat = malloc(sizeof(char) * (head_len + strlen(tail) + 1));
- my_strcpy(concat, head);
- my_strcpy(concat + head_len, tail);
- return concat;
- }
複製代碼 啊仲有
char dataA[30]; scanf("%s", &dataA);
應該無 & 先岩,因為 dataA 已經係一個地址
有別於以下要 &i, &c 先係地址
int i; scanf("%d", &i);
char c; scanf("%c" &c); |