2009-11-20 33 views
5

Thông thường bạn có thể in một chuỗi trong C như thế này ..Format một chuỗi trong C

printf("No record with name %s found\n", inputString); 

Nhưng tôi muốn làm một chuỗi ra khỏi nó, làm thế nào tôi có thể làm điều đó? Tôi đang tìm kiếm một cái gì đó như thế này ..

char *str = ("No record with name %s found\n", inputString); 

Tôi hy vọng nó là rõ ràng những gì tôi đang tìm kiếm ...

+3

Tự làm ơn và mua "Ngôn ngữ lập trình C" của Kernigham & Ritchie. – Pete

+1

Cảm ơn Pete, tôi sẽ. – itsaboutcode

+0

http://www.eskimo.com/~scs/cclass/cclass.html –

Trả lời

31

Một lựa chọn sẽ được sử dụng sprintf, mà hoạt động giống như printf nhưng mất như nó tham số đầu tiên một con trỏ đến bộ đệm mà nó sẽ đặt chuỗi kết quả.

Tốt hơn nên sử dụng snprintf, có tham số bổ sung chứa độ dài của bộ đệm để tránh tràn bộ đệm. Ví dụ:

char buffer[1024]; 
snprintf(buffer, 1024, "No record with name %s found\n", inputString); 
3

Nhìn vào sprintf (xem bên dưới).

int n = sprintf(str, "No record with name %s found\n", inputString); 
3

Sử dụng

sprintf(str, "No record with name %s found\n", inputString); 
10

Bạn đang tìm kiếm gia đình sprintf chức năng. định dạng chung của họ là:

char output[80]; 
sprintf(output, "No record with name %s found\n", inputString); 

Tuy nhiên, sprintf bởi chính nó là vô cùng nguy hiểm. Nó là dễ bị cái gì đó gọi là tràn bộ đệm. Điều này có nghĩa là sprintf không biết chuỗi dây output mà bạn cung cấp là bao nhiêu, vì vậy nó sẽ sẵn sàng viết nhiều dữ liệu hơn nó có sẵn. Ví dụ, điều này sẽ biên dịch sạch, nhưng sẽ ghi đè lên bộ nhớ có giá trị — và không có cách nào để cho sprintf biết rằng nó đang làm điều gì sai trái:

char output[10]; 
sprintf(output, "%s", "This string is too long"); 

Các giải pháp là sử dụng một chức năng như snprintf, mà phải mất một thời gian tham số:

char output[10]; 
snprintf(output, sizeof output, "%s", "This string is too long, but will be truncated"); 

hoặc, nếu bạn đang ở trên một hệ thống Windows, sử dụng _sntprintf biến và bạn bè, trong đó bảo vệ chống lại tràn của một trong hai đầu vào hoặc đầu ra chuỗi.

+3

Vì đó là một câu hỏi về bài tập về nhà, tôi chỉ muốn chỉ ra rằng 'outputof' chỉ cung cấp số lượng * elements * trong' char 'mảng - thực hành thông thường là sử dụng:' mảng mảng sizeof/sizeof [0] ', hoạt động mà không phụ thuộc vào kích thước của các kiểu khác nhau. Thêm vào đó, nó cũng làm việc cho các mảng 'char'. :) –

+0

Điểm tốt. Mặc dù vậy, có thể thất bại trong một số trường hợp thực sự phổ biến, chẳng hạn như truyền 'mảng' thành một hàm - tại điểm đó,' mảng sizeof' là 4 hoặc 8 trên bất kỳ hệ thống hiện đại nào, bất kể số lượng và kích thước của các phần tử trong đó.Giải pháp thực sự là sử dụng 'std :: vector' hoặc một cái gì đó tương tự và tránh toàn bộ mớ hỗn độn. –

7

Vì đây là bài tập về nhà (cảm ơn bạn đã gắn thẻ cho nó như vậy), tôi sẽ đề nghị bạn xem xét kỹ họ của các chức năng ...printf().

Tôi chắc chắn bạn sẽ tìm thấy giải pháp :)

+3

À, có vẻ như những người khác đã bỏ rơi bạn về niềm vui khám phá :) –

+1

+1 dù sao để đưa ra một loại câu trả lời đúng cho một câu hỏi về bài tập về nhà. –