練習1-20 編寫程式detab:將輸入的製表符替換成適當數目的空格,使空格充滿到下一個製表符終止位的地方

發表於2019-03-02

《C語言程式設計》練習1-20 編寫程式detab

疑惑:主要是搞清楚製表符終止位是什麼意思。
題意理解:製表符終止位可以看成是Excel單元格之間的豎線。這道題可以理解為:從鍵盤依次輸入字元序列,往Excel單元格中填(自己想象),一個單元格的寬度為N(也就是可容納的字元個數),當在填充單元格時輸入了製表符(也就是按下tab鍵時)就跳到下一個單元格的開頭填,如果上一個單元格沒有填滿,則需要用空格將其填滿;如果填滿了單元格時都沒有遇到製表符則自動跳到下一個單元格,從頭開始填充。這裡就是要求用空格來填充滿單元格剩下的空間, 來達在填寫Excel表格中到按下tab鍵時的效果。
例如:
假設單元格寬度為6,如果輸入了 ‘abc’三個字元後,輸入製表符(\t),那麼就要用3個空格將其填滿;
如果輸入了‘a’後輸入製表符,則需要輸入5個空格填滿。
一種特殊情況,如果在開頭就輸入製表符,則需要6個空格將其填滿。

所以關鍵是判斷在當前單元格已輸入了幾個字元,用單元格寬度減去即可得到輸入填充的空格數。
程式碼如下:

/* P25 練習1-20 ,編寫程式detab:將輸入的製表符替換成適當數目的空格,使空格充滿到下一個製表符終止位的地方。
	製表符終止位可以看成是Excel每2個單元格之間的豎線。
	這道題的可以理解為:從鍵盤輸入字元,往Excel單元格中填,一個單元格寬度為N,當在填充單元格輸入製表符(也就是按下tab鍵時)
	就跳到下一個單元格開始填,如果填滿了單元格都沒有遇到製表符則自動跳到下一個單元格,開始填充。這裡就是要求用空格來填充滿單元格剩下的空間
	來達到按下tab鍵時的效果。
*/

#include <stdio.h>

#define N 6		/* 每隔N列出現一個製表符終止位 */

void space_replace_table(){
	int c,cursor_pos,fill_num;
	cursor_pos = 1;		/* 當前游標在單元格中處於第幾列 */
	fill_num = 0;		/* 要填充的空格數 */

	while( (c=getchar()) != EOF){
		if(c == '\t'){
			if( cursor_pos > N)
				cursor_pos %= N;			
			fill_num = N - cursor_pos + 1;	/* 要填充的空格數 */
			if( fill_num > N)
			{
				printf("Error: fill_num = %d more than N\n", fill_num);
			}
			while(fill_num > 0){
				putchar(' ');
				fill_num--;
			}
			putchar('|');		/* 在每一個單元格後面輸出一條豎線 */
			cursor_pos = 1;		/* 跳到下一個單元格開頭 */
		}else if(c == '\n'){
			putchar('\n');
			cursor_pos = 1;
		}
		else{
			putchar(c);
			cursor_pos++;
			if( cursor_pos % N == 1)
				putchar('|');
		}
	}
}

void main(){
	space_replace_table();
}

效果如下:
在這裡插入圖片描述

相關文章