《C程序设计语言》读书笔记----习题1-21
生活随笔
收集整理的這篇文章主要介紹了
《C程序设计语言》读书笔记----习题1-21
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目就不寫了,大概意思就是:盡量用制表符'\t'替換掉字符串中的空格。
同學們需要注意的是,打印一個制表符'\t',其所占長度不是固定的。
這里要理解“制表符”和“制表符終止位”。“制表符”的作用是使得光標移動到下一個“制表符終止位”上。舉個例子,假設制表符終止位是4、8、12、16......已經已經輸入了10個字符,然后按一下Tab鍵,那么光標會移動到位置12上,同學們新建一個文本文檔試一下就了解了。
這個題目看似簡單,但是寫一個簡單、清晰的程序還是需要花一點腦筋的。
/* 這個程序看似簡單,但是寫一個簡單、清晰的程序還是需要花一點腦筋的。 要去思考:什么情況下可以用一個'\t'代替空格?事實上只有兩種情況,那就是:1、當一個“非空格字符”和該字符的下一個制表符終止位之間全部都是空格的時候,就可以用一個制表符'\t'替換這些空格例如:(用 _ 代表一個空格,用 | 表示制表符終止位,注意 | 并不是字符串的一部分)_ _ _ a b c _ _ | _ b c d f t q u r | _ d 能夠用制表符替換的空格只有:(用 * 號 表示用制表符替換掉的空格)_ _ _ a b c * * | _ b c d f t q u r | _ d2、當兩個制表符終止位之間全部都是空格的時候。這些空格就可以用'\t'替換。
例如:
_ _ _ _ _ a b c | _ _ _ _ _ _ _ _ | a b c
替換之后:
_ _ _ _ _ a b c | * * * * * * * * | a b c */#include<stdio.h>#define TABSTOP 8 //在Console中,制表符終止位一般是8,16,24,32......int main() {int total = 0; //已經讀到的字符數int spaces = 0; //已經讀到的空格數char c; //當前讀到的字符while ((c = getchar()) != EOF){if (c != ' ') //如果c不是一個空格 { if (spaces == 0) //如果已經讀到 0 個空格 {putchar(c);++total;}else //c不是一個空格,但是讀到的空格數 不等于 0 {for (; spaces > 0; --spaces)//輸出空格putchar(' ');spaces = 0; //讀到的空格數重新置為 0 ++total;putchar(c);//輸出當前讀到的字符 }if (c == '\n'){total = 0;spaces = 0;}}else //讀了一個空格 {++total;++spaces;int temp = (total-spaces) / TABSTOP;int nextLocation = (++temp) * TABSTOP;//下一個 制表符終止位if ( total< nextLocation);else//用'\t'填充空格 {for (int i = 0; i < (nextLocation - (total-spaces)); i++)//為了明確輸出的是'\t',用*號比較直觀。putchar('*');//putchar('\t');spaces = 0;//讀到的空格數重新置為 0 }}}return 0;}
?如果把一行先讀到一個字符數組里面,程序還會簡單一些:
1 #include<stdio.h> 2 3 #define TABSTOP 8 //在Console中,制表符終止位一般是8,16,24,32...... 4 #define MAXSIZE 1024 // char數組的最大長度 5 6 int getline(char s[] , int size); 7 8 int main() 9 { 10 char s [MAXSIZE]; 11 while (getline(s, MAXSIZE) != 0) 12 { 13 printf("%s",s); 14 int i = 0;// 遍歷s中的字符 15 char temp[MAXSIZE]; 16 int count = 0;//記錄temp中的字符的數量 17 18 for (; s[i] != '\0'; ++i) 19 { 20 if ((i + 1) % TABSTOP == 0 && s[i] == ' ') 21 { 22 int pre = i - 1; 23 while (pre > i - TABSTOP && s[pre] == ' ') 24 --pre; 25 ++pre; 26 for (int j = i - TABSTOP + 1; j < pre; ++j) 27 temp[count++] = s[j]; 28 //temp[count++] = '\t'; 29 for (int j = pre; j <= i; ++j) 30 temp[count++] = '*'; 31 } 32 if ((i + 1) % TABSTOP == 0 && s[i] != ' ') 33 for (int k = i / TABSTOP*TABSTOP; k <= i; ++k) 34 temp[count++] = s[k]; 35 } 36 for (int k = i / TABSTOP*TABSTOP; k < i; ++k) 37 temp[count++] = s[k]; 38 temp[count] = '\0'; 39 printf("%s",temp); 40 } 41 return 0; 42 43 } 44 45 int getline(char s[], int size) 46 { 47 char c; 48 int i; 49 for (i = 0; i < size - 1 && (c = getchar()) != EOF && c != '\n'; ++i) 50 s[i] = c; 51 if (c == '\n') 52 { 53 s[i] = c; 54 ++i; 55 } 56 s[i] = '\0'; 57 return i; 58 }?
轉載于:https://www.cnblogs.com/wzm-xu/p/4200206.html
總結
以上是生活随笔為你收集整理的《C程序设计语言》读书笔记----习题1-21的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UIRemoteNotification
- 下一篇: Hibernate的四种典型例子(增删改