Mã của bạn vòng cho đến khi nó đọc một từ duy nhất, sau đó thoát ra. Vì vậy, nếu bạn cho nó nhiều từ nó sẽ đọc đầu tiên và thoát ra, trong khi nếu bạn cho nó một đầu vào rỗng, nó sẽ lặp mãi mãi. Trong mọi trường hợp, nó sẽ chỉ in rác ngẫu nhiên từ bộ nhớ chưa được khởi tạo. Đây rõ ràng không phải là thứ bạn muốn, nhưng bạn muốn gì? Nếu bạn chỉ muốn đọc và in từ đầu tiên (nếu nó tồn tại), sử dụng nếu:
if (scanf("%15s", word) == 1)
printf("%s\n", word);
Nếu bạn muốn lặp miễn là bạn có thể đọc một từ, sử dụng khi:
while (scanf("%15s", word) == 1)
printf("%s\n", word);
Ngoài ra, như những người khác đã lưu ý, bạn cần phải cung cấp cho các mảng từ một kích thước đó là đủ lớn cho scanf của bạn:
char word[16];
những người khác đã đề nghị xét nghiệm cho EOF thay vì kiểm tra có bao nhiêu mục scanf phù hợp. Điều đó tốt cho trường hợp này, nơi scanf không thể không khớp trừ khi có EOF, nhưng không tốt trong các trường hợp khác (ví dụ như cố gắng đọc số nguyên), trong đó scanf có thể khớp với không có gì mà không đạt EOF (nếu đầu vào là không) t một số) và trả về 0.
chỉnh sửa
Hình như bạn đã thay đổi câu hỏi của bạn để phù hợp với mã của tôi mà làm việc tốt khi tôi chạy nó - loops đọc lời cho đến khi EOF đạt được và sau đó thoát ra. Vì vậy, cái gì khác đang xảy ra với mã của bạn, có lẽ liên quan đến cách bạn đang nuôi dưỡng nó đầu vào theo đề nghị của David
Nguồn
2010-09-22 16:24:32
Bạn đang sử dụng đầu vào nào? Bạn đang chuyển hướng tệp sang 'stdin' hoặc nhập vào bảng điều khiển? Nếu sau này, bạn đang sử dụng hệ điều hành nào và bạn gõ vào EOF bằng cách nào? –