2011-01-30 42 views
12

Có cách nào để chỉ in một phần của chuỗi không?In một phần của chuỗi trong C

Ví dụ, nếu tôi có

char *str = "hello there"; 

Có cách nào để chỉ in "hello", hãy nhớ rằng các chuỗi con tôi muốn in là chiều dài thay đổi, không phải lúc nào 5 ký tự?

Tôi biết rằng tôi có thể sử dụng một vòng lặp forputchar hoặc tôi có thể sao chép mảng và sau đó thêm một terminator null nhưng tôi tự hỏi nếu có một cách thanh lịch hơn?

+0

nhân vật hoặc tiêu chí mà bạn muốn dừng lại trên là gì? thật khó để trả lời câu hỏi này mà không cần làm rõ – kelloti

Trả lời

28

Hãy thử điều này:

int length = 5; 
printf("%*.*s", length, length, "hello there"); 
+2

Tôi đã 7 giây quá chậm =) – SiegeX

+1

@SiegeX: Yup - thêm 'bao gồm \ nintmain (void) \ n {' bạn có trong ... :-) –

+0

Tất nhiên, nếu anh ta muốn in ra stderr, hoặc một tập tin, hoặc một nhãn trong một số GUI, 'printf' cổ điển sẽ không giúp ích gì. Có thể làm cho một lưu ý của sprintf/fprintf quá? –

14

này sẽ làm việc quá:

fwrite(str, 1, len, stdout); 

Nó sẽ không có những phí của phân tích sự xác định định dạng. Rõ ràng, để điều chỉnh phần đầu của chuỗi con, bạn có thể chỉ cần thêm chỉ mục vào con trỏ.

+0

Mặc dù tôi * yêu * bằng cách sử dụng định dạng kiểu «printf', đây là câu trả lời đơn giản nhất do đó thanh lịch nhất. – dummydev

1

Bạn có thể sử dụng strncpy để sao chép phần của chuỗi bạn muốn in, nhưng bạn phải cẩn thận để thêm một terminator rỗng, vì strncpy sẽ không làm điều đó nếu nó không gặp phải một chuỗi nguồn. Một giải pháp tốt hơn, như Jerry Coffin đã chỉ ra, đang sử dụng hàm *printf thích hợp để viết ra hoặc sao chép chuỗi con bạn muốn.

Trong khi strncpy có thể nguy hiểm trong tay của một người nào đó không quen với nó, nó có thể được nhanh hơn về thời gian thực hiện so với một giải pháp phong cách printf/sprintf/fprintf, vì không không ai trong số các nguyên cần thiết để đối phó với các định dạng chuỗi. Đề nghị của tôi là để tránh strncpy nếu bạn có thể, nhưng nó là tốt để biết về chỉ trong trường hợp.

size_t len = 5; 
char sub[6]; 
sub[5] = 0; 
strncpy(sub, str + 5, len); // char[] to copy to, char[] to copy from(plus offset 
          // to first character desired), length you want to copy 
0

printf và bạn bè làm việc tốt khi đó là tất cả các bạn muốn làm gì với chuỗi một phần, nhưng đối với một giải pháp tổng quát hơn:

char *s2 = s + offset; 
char c = s2[length]; // Temporarily save character... 
s2[length] = '\0'; // ...that will be replaced by a NULL 
f(s2); // Now do whatever you want with the temporarily truncated string 
s2[length] = c;  // Finally, restore the character that we had saved 
+1

Điều này sẽ cho UB nếu bạn vượt qua một chuỗi chữ (đó là những gì OP cho thấy ...) –

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