2012-04-24 55 views
16

One of the answers-Why do you not use C for your web apps? chứa sau:C nối chuỗi các hằng số

For the C crap example below:

const char* foo = "foo"; 
const char* bar = "bar"; 
char* foobar = (char*)malloc(strlen(foo)+strlen(bar)+1); 
strcpy(foobar, foo); 
strcat(foobar, foo); 

Actually, constants CAN AND SHOULD be concatenated naturally in C:

const char foo[] = "foo"; 
const char bar[] = "bar"; 
char foobar[] = foo bar; // look Ma, I did it without any operator! 

And using [] instead of * will even let you modify the string, or find their length:

int foo_str_len = sizeof(foobar)-1; 

So, PLEASE, before you (falsely) claim that C is difficult to use with strings, learn how to use C.


Tôi đã thử nó bản thân mình nhưng nhận được một lỗi:

expected ‘,’ or ‘;’ before string constant

Vì vậy, câu hỏi của tôi là: Tôi có cần phải nói với trình biên dịch một cái gì đó để làm cho công việc này hoặc là bài viết trên chỉ đơn giản là sai? Xin lưu ý rằng tôi biết các cách khác để ghép các mảng ký tự trong C.

+15

Câu trả lời đó là vô nghĩa. –

Trả lời

33

(char*)malloc

Never định kiểu kết quả của malloc trong C. đọc thisthis.

Actually, constants CAN AND SHOULD be concatenated naturally in C

Không, chuỗi literals có thể và nên được nối trong C. "foo" là một chuỗi chữ và const char foo[] là một chuỗi liên tục (mảng các ký tự). Mã số "foo" "bar" sẽ tự động nối, mã foo bar sẽ không.

Nếu bạn muốn, bạn có thể ẩn xâu đằng sau macro:

#define foo "foo" 
#define bar "bar" 
char foobar[] = foo bar; // actually works 

So, PLEASE, before you (falsely) claim that C is difficult to use with strings, learn how to use C.

C khá khó khăn để sử dụng với các chuỗi, như chúng ta có thể nhìn thấy từ ví dụ này rất. Mặc dù tự tin kiêu ngạo của họ, người đã viết nó lẫn lộn các khái niệm khác nhau và vẫn phải học cách sử dụng C.

+0

+1 Cảm ơn câu trả lời chi tiết. –

+0

@Lundin thực hiện điều này với '" foo "bar()' trong đó 'bar()' trả về 'char *'? –

+1

@AlexejMagura Một char * không phải là một chuỗi chữ, vì vậy không. – Lundin

7

Câu trả lời đó trông giống như ai đó được quản lý để liên kết các chuỗi ký tự, có thể được ghép theo cách đó, với các biến chuỗi const. Đoán của tôi là bản gốc có các macro tiền xử lý thay vì các biến.

-1
#include <stdio.h> 
#include <string.h> 

int 
main(int argc, char *argv[]) 
{ 
    char *str1 = "foo"; 
    char *str2 = "bar"; 
    char ccat[strlen(str1)+strlen(str2)+1]; 

    strncpy(&ccat[0], str1, strlen(str1)); 
    strncpy(&ccat[strlen(str1)], str2, strlen(str2)); 
    ccat[strlen(str1)+strlen(str2)+1] = '\0'; 

    puts(str1); 
    puts(str2); 
    puts(ccat); 
} 

mã này concatenates str1str2 mà không cần malloc, sản lượng nên là:

foo 
bar 
foobar 
+0

Vâng, tôi biết , Tôi quên quay lại trạng thái thoát – Raiz

+0

Vui lòng không quay lại. SO không phải là một trang web hướng dẫn. – Michi

Các vấn đề liên quan