Tôi đang nghiên cứu cuốn sách R & R. Hiện tại tôi đang đọc hàm getop() tại trang p.78. Tôi hiểu mã nhưng tôi cần giải thích về 2 điều.getop() chức năng K & R book p 78
Mã của getop() như sau:
int getch(void);
void ungetch(int);
/* getop: get next character or numeric operand */
int getop(char s[])
{
int i, c;
while ((s[0] = c = getch()) == ' ' || c == '\t')
;
s[1] = '\0';
if (!isdigit(c) && c != '.')
return c; /* not a number */
i = 0;
if (isdigit(c)) /* collect integer part */
while (isdigit(s[++i] = c = getch()))
;
if (c == '.') /* collect fraction part */
while (isdigit(s[++i] = c = getch()))
;
s[i] = '\0';
if (c != EOF)
ungetch(c);
return NUMBER;
}
Câu hỏi của tôi là về: s[0]
trong:
while ((s[0] = c = getch()) == ' ' || c == '\t')
Ý tưởng đằng sau vòng lặp while là bỏ qua không gian và tab ngang, vậy tại sao chúng ta tiết kiệm 'c' trong s [0]? Tại sao tác giả không chỉ đơn giản viết:
while (c= getch() == ' ' || c == '\t')
Chúng tôi sẽ không sử dụng không gian và các tab sau này, tại sao chúng ta cần phải lưu c trong s[0]
cho? Nhu cầu cho s[0]
ở đây là gì?
câu hỏi thứ hai của tôi là về:
s[1] = '\0';
Tại sao chúng ta gán '\ 0' (kết thúc chuỗi) để s[1]
đây?
Tôi đã đọc một số câu trả lời trước đây được đăng trên stackoverflow.com về nó nhưng tôi không hoàn toàn thuyết phục!
Câu trả lời được chấp nhận về câu hỏi trên là: "Vì hàm có thể trả về trước khi đầu vào còn lại được đọc, và sau đó s cần phải là chuỗi hoàn chỉnh (và đã kết thúc)".
Ok. Nhưng nếu đầu vào có một khoảng trắng ở đầu và sau đó là toán hạng hoặc toán tử thì sao? Trong trường hợp này, s[1] = '\0'
sẽ đóng chuỗi quá sớm? phải không?
Giải thích tốt, mặc dù tôi sẽ loại bỏ các tính từ tích cực như "thuận tiện", vì điều đó gợi ý rằng mã K & R lộn xộn này tuân theo một số loại thực hành mã hóa C tốt, trong khi nó thực sự được lấp đầy với điều ngược lại. – Lundin
@Lundin: Tôi đồng ý hoàn toàn rằng mã K & R được đề cập là khủng khiếp từ quan điểm "thực hành mã hóa tốt", nhưng mã minh họa một số tính mới nhất của ngôn ngữ C quan trọng cho người mới học. Từ quan điểm của thiết kế thuật toán, và tôi tin từ quan điểm của tác giả ban đầu của mã (trước khi "thực hành mã hóa tốt" ngày nay được hình thành), việc gán cho s [0] vào thời điểm này trong mã là tiện lợi, vì nó sẽ không cần phải được thực hiện sau này. – sifferman