2016-04-14 13 views
5

Đoạn mã này hoạt động hơi lạ với khẩu vị của tôi. Xin vui lòng, bất cứ ai quan tâm để giải thích lý do tại sao? Và làm thế nào để buộc '\ n' được hiểu là một char đặc biệt?Giải thích ' n' trong printf ("% s", chuỗi)

[email protected]:~/tmp/user/foo/bar$ ./interpretastring.x "2nd\nstr" 
1st 
str 
2nd\nstr 
[email protected]:~/tmp/user/foo/bar$ cat interpretastring.c 
#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    char *s="1st\nstr"; 

    printf("%s\n", s); 
    printf("%s\n", argv[1]); 

    return 0; 
} 

Tóm lại, ý định là chuỗi thứ hai được in thành hai dòng, giống như đầu tiên. Chương trình này đơn giản hóa. Chương trình thực sự có vấn đề đọc từ một tập tin sử dụng fgets (không phải là một đối số S.O. argv như ở đây), nhưng tôi nghĩ giải quyết ở đây cũng sẽ giải quyết ở đó.

+4

Thoát dấu gạch chéo có ý nghĩa trong mã nguồn *, nhưng không quan trọng đối với 'printf' cũng như' fgets' cũng như bất kỳ chức năng thư viện thời gian chạy C nào khác. Các đối số dòng lệnh có thể nhận được dấu gạch chéo ngược của chúng được chuyển đổi thành thứ gì đó khác * bằng shell *, nhưng bạn không thể dựa vào điều đó hoặc bạn có thể dựa vào nó phù hợp với trình biên dịch C làm chuỗi ký tự nào. Nếu bạn muốn dịch '\ n' thành ký tự dòng mới trong đầu vào của chương trình, bạn sẽ phải tự làm điều đó bằng tay. – zwol

+0

Cảm ơn bạn. Bình luận rất thích hợp. Có lẽ có chức năng như vậy đã có trong thư viện C rộng lớn? –

+1

Tôi rất tiếc phải nói rằng không có chức năng như vậy. – zwol

Trả lời

0

Đối với tất cả các mục đích, điều này chỉ chăm sóc \n và không có nhân vật nào khác được điều trị đặc biệt.

Câu trả lời này ở đây thực hiện công việc với độ phức tạp thấp hơn. Nó không thay đổi "2 ký tự" thành "một đơn đặc biệt \n". Nó chỉ thay đổi <\><n> thành "<space><newline>". Đó là tốt. Sẽ tốt hơn nếu có C Standard Library để giải thích đặc biệt chars trong một chuỗi (như tôi biết nó có cho ví dụ RegExp).

/* change '\\n' into ' \n' */ 
void changebarn(char *nt) 
{ 
    while(nt!=NULL) 
     if((nt=strchr(nt,'\\'))) 
      if(*++nt=='n') 
      { 
       *nt='\n'; 
       *(nt-1)=' '; 
      } 
} 
+1

Tất nhiên, bây giờ bạn cần phải lo lắng về việc muốn vượt qua '\' theo sau bởi 'n' làm chữ, chứ không phải là dòng mới. Điều này có nghĩa là bạn cần cho phép dấu gạch chéo ngược để thoát khỏi chính nó, vì vậy bạn có thể chuyển 'foo \\ nbar '' và nhận 'foo \ nbar' làm đầu ra chữ, với dấu gạch chéo ngược và' n', không phải là dòng mới. – ShadowRanger

+0

Hi @ShadowRanger, tôi đã nghĩ về điều đó trước khi viết mã này. Nhận xét của bạn rất quan trọng đối với những người đang đọc câu trả lời này. Đối với tôi, đầu vào của tôi không có chữ '" \\ n "'. Char đặc biệt duy nhất tôi cần giải thích chỉ là ''\ n'' và' '\\ n" 'sẽ được đọc là' <\>< ><\n> ', không sao cả. Cảm ơn cho điểm đó ra, mặc dù. +1. –

1

Có vẻ như trình bao không nhận ra và chuyển đổi "chuỗi thoát". Sử dụng phần mềm vỏ hỗ trợ chuỗi thoát \n.

+0

Giải pháp này không giải quyết được vấn đề của tôi. Tôi không muốn phần thứ ba diễn giải '\ n'. BTW, tôi cũng đã nhận xét trong câu hỏi về việc đọc một chuỗi từ một tệp bằng cách sử dụng 'fgets()'. –

+0

Vì vậy, bạn muốn mã diễn giải 2 ký tự chữ '\' và 'n' thành một ký tự dòng mới, nhưng bạn đặc biệt không muốn mã của bên thứ ba thực hiện điều đó? – brycem

+0

Bạn không thể yêu cầu tôi thay đổi API của mình để giải quyết vấn đề. Chuỗi tôi nhận được là, và đó là nó. Tôi phải đối phó với nó trong mã của riêng tôi (hoặc thư viện C). Dù sao, nó là một vấn đề đơn giản. Câu hỏi của tôi là nhiều hơn nếu có một thư viện C giải thích chuỗi đó. –

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