2016-01-29 15 views
5

Chương trình nhận dạng mẫu phải in tất cả các dòng chứa patter nếu đầu vào tìm mẫu. Nếu đầu vào là mẫu tìm -x, chương trình phải in tất cả các dòng ngoại trừ các dòng chứa mẫu.Làm rõ trong Phần 5.10 của K & R 2

// ..... 
switch(c) 
{ 
case 'x': 
    except=1; 
    break; 
// ...... 
} 

// ...... 
while(getline(line,MAXLINE)>0) 
    { 
    line_num++; 
    if((strstr(line,*argv)!=NULL) != except) 
     { 
     if(number) 
      printf("%ld:",linenum); 
     printf("%s",line); 
     found++; 
     } 
    } 
// ...... 

Trong đoạn mã trên từ K & R trừ có thể là 1 hoặc 0. Làm thế nào để if(strstr...) chức năng khối một cách hiệu quả để xử lý -x?

+0

Tôi không hiểu câu hỏi. Bạn có thể xây dựng? –

+0

Bạn có thể cập nhật câu hỏi của mình để hiển thị định nghĩa và khởi tạo 'ngoại trừ' không? –

Trả lời

3

Logic đơn giản. Nếu mẫu là "-x", chúng tôi sẽ in tất cả các dòng không chứa mẫu.

Đối với mẫu này except bằng 1.

Vì vậy, dòng có chứa các mô hình đáp ứng các điều kiện

strstr(line,*argv)!=NULL 

đó là tình trạng này sẽ luôn luôn bằng 1 nếu một dòng chứa mẫu.

Do đó nếu except bằng 1 và điều kiện strstr(line,*argv)!=NULL bằng 1, chúng ta nên bỏ qua mẫu.

Nếu không nếu điều kiện strstr(line,*argv)!=NULL không bằng 1 có nghĩa là nếu mô hình không được tìm thấy sau đó câu lệnh if

if((strstr(line,*argv)!=NULL) != except) 

mang lại sự thật và tuyên bố hợp chất của nó được thực thi.

Mặt khác nếu except bằng 0 sau đó để đạt được điều đó với điều kiện trong câu lệnh if sẽ đánh giá đúng sự thật, chúng ta cần có các điều kiện strstr(line,*argv)!=NULL sẽ bằng 1.

Trong thực tế, bạn có thể viết lại câu lệnh if

if((strstr(line,*argv)!=NULL) != except) 

theo cách sau

if(((strstr(line,*argv) != NULL) == 1 && except == 0) || 
    ((strstr(line,*argv) != NULL) == 0 && except == 1)) 

nói Ngay câu lệnh if làm việc nếu một trong hai

1 and 0 

hoặc

0 and 1 

Nếu một trong hai

1 and 1 

hoặc

0 and 0 

sau đó câu lệnh if sẽ không được thực thi.

Ở đây 1 và 0 là kết quả đánh giá hai biểu thức phụ trong câu lệnh if.

3

Tôi không quen thuộc với mã này, tuy nhiên tuyên bố này sẽ đánh giá để một boolean (0 hoặc 1) như strstr() sẽ trả về một con trỏ tới từ được tìm kiếm hoặc NULL nếu không tìm thấy:

strstr(line, *argv) != NULL 

Vì vậy, Tôi đoán except được đặt thành 0 hoặc 1 để thực hiện điều kiện "không tìm thấy" hoặc "đã được tìm thấy".

Nếu -x không được thông qua sau đó except0:

if ((strstr(line, *argv) != NULL) != 0) 

có nghĩa là nếu từ đó đã được tìm thấy vào khoản if.

Nếu -x được truyền sau đó except1:

if ((strstr(line, *argv) != NULL) != 1) 

có nghĩa là nếu từ đó đã được tìm thấy không nhập khoản if.

Nó là mã khó hiểu, vì vậy tôi muốn giới thiệu phá vỡ nó xuống:

const char *word = strstr(line,*argv); 
int wasfound = word != NULL; 
if (wasfound != except) 
{ 

} 

và sau đó bước qua với một trình gỡ lỗi. Học cách sử dụng trình gỡ lỗi cũng rất quan trọng.

0

Toán tử != có cùng giá trị chân lý với thao tác XOR. Vì vậy, bạn có thể phá vỡ

if((strstr(line,*argv)!=NULL) != except) 
    { 
    if(number) 
     printf("%ld:",linenum); 
    printf("%s",line); 
    found++; 
    } 

vào (kém hiệu quả nhưng có lẽ rõ ràng hơn)

char found_one_match; 
if(strstr(line,*argv) != NULL) 
{ 
    found_one_match = 1; 
} 
else 
{ 
    found_one_match = 0; 
} 
found_one_match ^= except; 
if (found_one_match) 
{ 
    if(number) 
     printf("%ld:",linenum); 
    printf("%s",line); 
} 
found += found_one_match; 

Nói cách khác, except đảo ngược ảnh hưởng của những gì sẽ xảy ra khi một mô hình được tìm thấy trong chuỗi.

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