2011-10-30 26 views
5

Tại sao đoạn mã cụ thể này trả về false trên strstr() nếu tôi nhập "test"?strstr không hoạt động

char input[100]; 

int main() 
{ 
    fgets(input, 100, stdin); 
    printf("%s", input); 

    if(strstr("test message", input)) 
    { 
     printf("strstr true"); 

    } 


} 

Tôi nghĩ strstr đã tìm kiếm thông số đầu tiên cho các trường hợp của tham số thứ hai? Nó hoạt động khi tôi thay thế đầu vào bằng một số văn bản hoặc chỉ gán nó một cái gì đó trực tiếp, nhưng có vẻ như nó không hoạt động với các fgets.

+0

Đối với việc xử lý sự cố, có http://stackoverflow.com/questions/2693776/removing-trailing-newline-character-from-fgets-input –

Trả lời

10

Đó là vì các cửa hàng lưu trữ ký tự dòng mới nên khi strstr thực hiện so sánh thì không thành công.

Từ xem man page:

fgets() đọc trong ít nhất một ít hơn nhân vật có kích thước từ dòng và lưu trữ chúng vào bộ đệm được trỏ đến bởi s. Đọc dừng sau một EOF hoặc một dòng mới. Nếu một dòng mới được đọc, nó được lưu trữ vào bộ đệm. Dấu '\ 0' được lưu sau ký tự cuối cùng trong bộ đệm.

+0

Xóa có thể và bạn nhận được +1 :) – FailedDev

+0

@sashang phần tài liệu đó vẫn còn khó hiểu. Nó nói EOF hoặc newline. Đó là nó? Tôi đã đi qua một hướng dẫn và nó đã không làm tôi thất vọng. Thay thế ký tự cuối cùng bằng một null '\ 0' đã làm thủ thuật nhưng hướng dẫn làm cho nó có vẻ như' fgets' tự động đặt '\ 0' khi thực tế nó đặt' \ n'. Bởi vì 'strstr' này không hoạt động. Nhưng tại sao cuốn sách nói nó sẽ hoạt động? – Andy

+0

@Andy: 'EOF hoặc newline' có nghĩa là EOF hoặc newline hoặc cả hai. 'hoặc' ở đây có ý nghĩa của logic boolean hoặc không 'hoặc' được sử dụng trong tiếng Anh thông tục. Do đó cả hai đều là một câu trả lời hợp lệ. – sashang

6

Thêm input[strlen(input) - 1] = '\0'; sau fgets. fgets đọc trong dòng mới char ('\n'). Không có '\n' trong "test message" vì vậy input sẽ không bao giờ được chứa trong đó.

Bạn thực sự nên kiểm tra xem dòng mới có nằm ở cuối bộ đệm hay không sau khi gọi fgets để biết toàn bộ dòng có thể thực sự khớp với nó hay không, và rõ ràng là xóa nó.

+0

Tôi giả sử rằng khi 'fgets' đọc, nói,' "Hello" ', nó thực sự đọc' "Xin chào \ n \ 0" 'hoặc' "Xin chào \ n" '. – Andy

+0

Nó đọc '" Xin chào \ n "' và sau đó chấm dứt chuỗi bằng một ''\ 0''. Nhưng đó chỉ là nếu có một ký tự dòng mới được đọc. – AusCBloke

+0

Hãy để tôi thuật lại câu hỏi. Tổng kết quả sẽ là gì của 'fget'? Tôi hỏi vì 'strstr' không hoạt động. Khi tôi làm 'biến [strlen (biến) -1] = '\ 0'', nó hoạt động. Khi 'strlen' phân tích cú pháp chuỗi cho độ dài, nó có bỏ qua giá trị null kết thúc không? Vì vậy, '" Hello \ n \ 0 "', là nó 6 vì nó bao gồm dòng mới? Và nếu có, thì kết quả sẽ là '" Xin chào \ 0 \ 0 "' nếu đó là cách tôi giải quyết vấn đề của tôi có chút lãng phí. Cảm ơn thời gian của bạn bằng cách này. – Andy