2016-01-19 14 views
9

Khi tôi đọc Ngôn ngữ lập trình C và thực hiện bài tập 1-10, có một vấn đề khiến tôi bối rối.Cách lưu trữ ký tự ' b' và làm cho nó được nhận dạng bởi tệp của chương trình c

Người ta nói rằng khi tôi nhập một backspace, nhân vật được xử lý bởi trình điều khiển giao diện điều khiển và không được chuyển giao cho chương trình, vì vậy những gì tôi có thể làm là tạo một tập tin với backspace nhúng.Tuy nhiên, nó có vẻ vô dụng không có vấn đề tôi trực tiếp nhập '\ b' hoặc nhấn Ctrl + H.

Khi tôi nhấn Ctrl + H, màn hình sẽ hiển thị "\ b", nhưng khi tôi chạy chương trình, có vẻ như chương trình vẫn sẽ xem dưới dạng hai ký tự '\' và 'b'. Không có vấn đề gì tôi nhập vào, nó không bao giờ cho thấy "\ backspace" khi tôi chạy chương trình.

Tôi nên làm gì để làm cho chương trình nhận ra nó là một ký tự của backspace?

mã của tôi là như sau:

#include <stdio.h> 
int main() 
{ 
    int c; 
    while((c=getchar())!=EOF){ 
     if(c=='\t') 
      printf("\\t"); 
     else if(c=='\\') 
      printf("\\\\"); 
     else if(c=='\b') 
       printf("\\backspace"); 
      else 
       putchar(c); 
    } 
} 
+0

"tạo tệp" Bạn đã tạo tệp này bằng cách nào? (biên tập văn bản nào?) – Rufflewind

+0

Tôi sử dụng vim và tạo một tệp có tên b. Sau đó gõ lệnh ./a.out

+1

Bạn phải sử dụng [tổ hợp phím đặc biệt trong vim để nhập ký tự điều khiển] (http://stackoverflow.com/a/1585463) chẳng hạn như backspace. Trong trường hợp của bạn, bạn nên nhập 'ctrl + v', tiếp theo là' ctrl + h'. Điều đó sẽ nhập một ký tự backspace thực. – Rufflewind

Trả lời

4

Tôi không nghĩ rằng vấn đề là với mã của bạn, nhưng với cách bạn đã viết ký tự backspace trong trình soạn thảo văn bản của bạn.

Bạn phải sử dụng số special key combination in vim to enter control characters chẳng hạn như backspace. Trong trường hợp của bạn, bạn nên nhập ctrl + v theo sau là ctrl + h. Điều đó sẽ tạo ra một nhân vật backspace thực sự.

Để xem liệu bạn đã tạo ra một nhân vật xóa lùi thực tế, bạn có thể sử dụng hexdump:

$ hexdump myfile 
00000000 68 65 6c 6c 6f 20 08 77 6f 72 6c 64    |hello .world| 
          ^^ 

Thông báo các 08, đó là nhân vật xóa lùi (trong C, nó biểu thị \b).


Một cách khác để tạo ra các nhân vật BackSpace là chỉ cần viết nó thông qua một chương trình trong C:

#include <stdio.h> 
int main(void) { 
    FILE *f = fopen("myfile", "w"); 
    fputs("hello \bworld", f); 
    fclose(f); 
    return 0; 
} 
+0

Bạn trả lời đã giải quyết được vấn đề của tôi, nó in backspace một cách chính xác. Cảm ơn nhiều! –

+0

Sau đó, bạn có thể cho tôi biết những phím nào tôi nên nhập trong Windows? –

+1

Nhúng một ký tự ASCII không in được trong mã nguồn, như ASCII 08, là điều ác. Sử dụng trình tự thoát dấu chéo ngược thích hợp để thay thế. –

2

BackspaceASCII đang 8.

Vì vậy, bạn có thể kiểm tra trên c == 0x08 khi đọc từ một tập tin.

else if(c == 0x08) 
    printf("\\backspace"); 

Bạn có thể muốn kiểm tra this.

+0

Vâng, tôi đã nhìn thấy nó ngay bây giờ và hiểu rằng chương trình. Nhưng, có vẻ như nó khác với tôi. Tôi chỉ không thể làm cho "\ c" trong một tập tin có thể được công nhận là một ký tự khi tôi làm cho chương trình chuyển hướng đến một tập tin có tên b mà nhúng "\ b" –

3

Vấn đề là không thực sự trong chương trình của bạn, nhưng, như bạn nói, trong terminal của bạn người lái xe. Hành vi kỳ quặc, như được quan sát bởi chương trình của bạn, là kết quả của mô hình thiết bị đầu cuối Unix.

Chú ý rằng sau khi bạn nhấn Tab, có lẽ bạn cũng phải nhấn Nhập trước khi chương trình của bạn thấy Tab như một nhân vật \t. Điều đó có nghĩa là thiết bị đầu cuối của bạn đang ở chế độ "đã nấu" (tức là, không phải chế độ thô).Tương tự, trình điều khiển thiết bị đầu cuối sẽ xử lý Ctrl + H trước khi chương trình của bạn là getchar() sẽ có cơ hội để xem nó.

Việc bạn có thể làm là chạy stty -icanon trước khi khởi chạy chương trình của mình. (Hoặc, bạn có thể do it programmatically trong thói quen khởi tạo chương trình của mình.) Sau đó, các tổ hợp phím như TabCtrl + H nhấn phím sẽ được chọn ngay lập tức theo số getchar().

Để khôi phục hành vi thiết bị đầu cuối mặc định, hãy sử dụng stty icanon hoặc stty sane.

+0

Tôi tìm thấy trang người đàn ông của stty và tìm thấy "stty sane", và tôi vẫn còn bối rối rằng làm thế nào để sử dụng nó và những gì giống như định dạng chính xác. Xin lỗi, tôi là một linux mới hơn, và bạn có thể cho tôi biết lệnh định dạng chính xác khi sử dụng stty icanon và stty sane không? –

+0

Chỉ cần gõ lệnh 'stty -icanon' vào dấu nhắc trình bao. –

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