2011-02-03 5 views
13

Tôi đang làm việc trên trò chơi Blackjack xương trần sử dụng ổ cắm, lịch sự của lớp Hệ điều hành của tôi. Chúng tôi đã được cung cấp một giao diện ổ cắm đã chuyển một mảng các ký tự qua lại.Xây dựng chuỗi từ các biến trong C

tôi đã hy vọng tôi có thể làm một cái gì đó như thế này:

char[] msgOut = printf("Dealer's Card is %C %C", char1, char2); 
sendMsg(msgOut); 

TUY NHIÊN, googling dẫn tôi để xác định rằng giá trị trở lại của printf là một int số lượng đầu ra của Char, không một char [] của chính các ký tự (như tôi đã hy vọng).

Có chức năng C nào khác cho phép tôi tạo chuỗi từ các biến của tôi không?

Trả lời

23

printf ghi vào đầu ra tiêu chuẩn. snprintf hoàn thành những gì bạn đang thực hiện ở đây. Chuỗi nội suy được lưu trữ trong 'bộ đệm' sau khi cuộc gọi đến snprintf. Bạn có thể muốn xác định kích thước bộ đệm của bạn thông minh hơn một chút, nhưng đây chỉ là một ví dụ.

char buffer[1024]; 
snprintf(buffer, sizeof(buffer), "Dealer's Card is %C %C", char1, char2); 
+0

Không, hãy xem ví dụ. Bộ đệm sẽ được sửa đổi tại chỗ. Nhiều hàm trong mã lỗi trả về C và sửa đổi các đối số của chúng tại chỗ. Bạn sẽ phải làm quen với mã viết này trong C. –

+0

Có. Thỉnh thoảng về phía tôi. Tôi đọc lại những câu trả lời của bạn sau khi viết bình luận đó. –

+1

@EdS .: Làm thế nào để bạn gắn thêm vào 'bộ đệm'. Nói rằng tôi muốn gọi 'snprintf' trên' buffer' nhiều lần, nhưng không muốn văn bản bên trong 'buffer' bị ghi đè. – arunmoezhi

8

Glibc (và một số thư viện C khác) có chức năng tiện lợi asprintf.

char *msgOut; 
asprintf(&msgOut, "Dealer's Card is %C %C", char1, char2); 
sendMsg(msgOut); 
free(msgOut); 

Điều này hữu ích nhất khi bạn không có dự đoán trước về số lượng bộ nhớ cần thiết để giữ chuỗi. (Nếu bạn làm thế, snprintf còn ít trên cao, vì nó không tự động cấp phát bộ nhớ.)

Trên các hệ thống mà không cần asprintf, nhưng với một tiêu chuẩn tương thích snprintf, nó có thể được thực hiện bởi hai cuộc gọi đến snprintf - lần đầu tiên không có đệm và kích thước bằng không để xác định chiều dài chuỗi, một sự can thiệp malloc và sau đó là lần thứ hai sử dụng không gian mới được cấp phát đó.

0

Nếu bạn muốn một người xây dựng chuỗi trong c tự động phân bổ bộ nhớ tôi thấy http://linux.die.net/man/3/vasprintf là hữu ích.

Ví dụ:

#include <stdio.h> 

int i; 
printf("//Simple dynamic string builder:\n"); 
char *strs[6] = {"I","am","an","array","of","strings"}; 

char *buf = "["; // open bracket 
for (i=0;i<6;i++) { 
    // Dynamically build and allocate memory 
    asprintf(&buf,"%s%s",buf,strs[i]); 
    if(i!=5) { // Add a comma , after each but skip the last 
     asprintf(&buf,"%s,",buf); 
    } 
} 
asprintf(&buf,"%s]",buf); // closing backet 
printf("\"%s\"\n",buf); 

Đầu ra là

//Simple string builder: 
"[I,am,an,array,of,strings]" 

nên char *buf là tự động được mở rộng bởi asprintf và đang xây dựng bằng cách định dạng riêng của mình vào báo cáo kết quả asprintf.

+0

Chỉ cần tham dự vào thực tế là 'asprintf' là một phần mở rộng GNU, và không phải là một phương pháp C/POSIX de facto. –