「寫入程序入口,用最少數量的製表符和空白代替空白符,以達到相同的間距,使用與製表符相同的製表符,當製表符或單個空白符足以達到製表位,應給予優先選擇?「K&R答案書練習1.21
我自己做了練習,本書的答案有不同的解決方案。我不理解從輸入流中讀取製表符時執行的數學公式。下面是代碼:
#include <stdio.h>
#define TABINC 8
main()
{
int c, nb, nt, pos;
nb = 0;
nt = 0;
for (pos = 1; (c =getchar()) != EOF; ++pos)
if (c == ' '){
if (pos % TABINC != 0)
++nb;
else {
nb = 0;
++nt;
}
}
else {
for (; nt > 0; --nt)
putchar('\t');
if (c == '\t')
nb = 0;
else
for (; nb > 0; --nb)
putchar(' ');
putchar(c);
if (c == '\n')
pos = 0;
else if (c == '\t')
pos = pos + (TABINC - (pos - 1) % TABINC) - 1;
}
}
我不理解的部分如下:
else if (c == '\t')
pos = pos + (TABINC - (pos - 1) % TABINC) - 1;
我可以通過在Visual Studio調試看到,這個結構帶來的POS到下一個製表位時從輸入流中出現選項卡。它是否正確?
我真的不明白的是這個公式是如何工作的,或者他們是怎麼想出來的。這是編程中常見的公式嗎?它有用嗎?它有名字嗎?
編輯:我明白模數運算符的作用。對不起,我沒有具體說明。
我很欣賞任何輸入。