2012-06-29 51 views
7

Tôi có một số char được cung cấp từ fgets và tôi muốn biết cách tôi có thể chuyển đổi nó thành một char*.C Chuyển đổi char thành char *

Tôi chắc chắn điều này đã được đăng trước đó, nhưng tôi không thể tìm thấy một trong đó đã làm khá những gì tôi muốn làm. Mọi câu trả lời đều được đánh giá cao.

EDIT: Đây là mã.

char *filename = "file.txt"; 
FILE *file = fopen(filename, "r"); 
if(file != NULL) { 
    char line[260]; 
    char *fl; 
    while(fgets(line, sizeof line, file) != NULL) { 
    // here I combine some strings with the 'line' variable. 
    str_replace(line, "\"", "\"\""); // A custom function, but it only takes char*'s. 
    } 
    printf(fl); 
    printf("\n"); 
} else { 
    printf(" -- *ERROR* Couldn't open file.\n"); 
} 
+15

Không, bạn không. 'fgets()' trả về kết quả 'char *', không trả về 'char'. Vui lòng cho chúng tôi ý tưởng tốt hơn về những gì bạn đang cố gắng làm, tốt nhất là đăng một số mã thực tế. –

+0

Ồ. Lỗi của tôi. Điều đó có nghĩa là tôi không thực sự cần câu hỏi này nữa. – Matthew

+0

Sau đó, bạn có thể (và nên) tự xóa câu hỏi. –

Trả lời

16

Vâng, trước hết, line là một mảng của char s và do đó có thể được thao tác theo cách tương tự như một char * (Xem comp.lang.c FAQs những khác biệt quan trọng), do đó bạn không cần phải lo lắng về nó.

Tuy nhiên, trong trường hợp bạn muốn một câu trả lời cho câu hỏi chung ...

Nhà điều hành & là những gì bạn cần:

char c; 
char *pChar = &c; 

Tuy nhiên, hãy nhớ rằng pChar là một con trỏ đến char và sẽ chỉ hợp lệ trong khi c nằm trong phạm vi. Điều đó có nghĩa là bạn không thể trả về pChar từ một hàm và mong đợi nó hoạt động; nó sẽ trỏ đến một số phần của heap và bạn không thể mong đợi rằng để giữ giá trị.

Nếu bạn muốn vượt qua nó như là một giá trị trả về, bạn sẽ cần phải malloc một số bộ nhớ và sau đó sử dụng con trỏ để viết giá trị của c:

char c; 
char *pChar = malloc(sizeof(char)); 

/* check pChar is not null */ 

*pChar = c; 
+0

"' line' là một 'char *', vì nó là một mảng 'char's" - Không, mảng không phải là con trỏ. Đọc phần 6 của [comp.lang.c FAQ] (http://www.c-faq.com). –

+0

@KeithThompson: "... mặc dù chúng có liên quan chặt chẽ". [Câu hỏi 6.2] (http://www.c-faq.com/aryptr/aryptr2.html) – Dancrumb

+0

Câu hỏi 6.2 làm cho nó rất rõ ràng rằng họ là những khái niệm hoàn toàn khác biệt. Vâng, chúng liên quan chặt chẽ; vì vậy có rất nhiều khái niệm trong bất kỳ ngôn ngữ lập trình nào. Có một quan niệm sai lầm phổ biến rằng các mảng C thực sự là con trỏ; chúng ta không thêm vào nó. –

4

Sử dụng các nhà điều hành & sẽ cung cấp cho bạn một con trỏ với nhân vật, như Dancrumb đã đề cập, nhưng có vấn đề về phạm vi ngăn cản bạn quay trở lại con trỏ, cũng như ông đã đề cập.

Một điều mà tôi phải thêm là tôi tưởng tượng rằng lý do bạn muốn một char* là để bạn có thể sử dụng nó như một chuỗi trong printf hoặc một cái gì đó tương tự. Bạn không thể sử dụng nó theo cách này vì chuỗi sẽ không bị NULL chấm dứt. Để chuyển đổi một char vào một chuỗi, bạn sẽ cần phải làm một cái gì đó giống như

char c = 'a'; 
char *ptr = malloc(2*sizeof(char)); 
ptr[0] = c; 
ptr[1] = '\0'; 

Đừng quên để giải phóng ptr sau!

+1

đối số malloc: 'sizeof (char)' là '1' bởi std; bạn chỉ có thể viết: 'malloc (2)' tương đương với. – Jack

+0

@Jack, có bất kỳ lý do cụ thể để làm điều đó, mặc dù, hơn là theo công thức thông thường của việc sử dụng 'sizeof'? – Daniel

+0

Có vẻ như không cần thiết phải chuyển đổi số lượng ký tự thành một số byte khi char được gán là một byte. Bạn có viết 'malloc ((strlen (foo) +1) * sizeof (char))' khi phân bổ không gian cho một bản sao của 'foo'? Trong mọi trường hợp, tôi thích 'foo = malloc (n * sizeof * foo)', hoạt động bất kể loại foo. –

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