Re: [問題] 排版用 '\b' 倒退但沒有效果

看板C_and_CPP作者 (f0VMRgEBA)時間12年前 (2013/06/09 12:37), 編輯推噓9(904)
留言13則, 10人參與, 最新討論串2/2 (看更多)
※ 引述《BestFr (ㄚ元)》之銘言: : 想請問一下,我在執行的時候總票數加總沒問題,可是在顯示出來時, : 總票數卻跟在下一行的人名前面,一開始是想用 "\b" 讓他到退一格, : 結果沒出現任何變化,可是用了"\t "之後卻有反應,不知道問題出在哪裡? : 還請會的人教一下 感恩!!! : 目前剛學程式,觀念都很薄弱.....請見諒 : 程式碼(Code):(請善用置底文網頁, 記得排版) :http://tinyurl.com/koflkaz 不知為何數小時前 codepad 一直打不開... 總之看到程式了 有件事情要先說 沒寫在 printf 裡的字並不會自動加上去 (不像某語言還要特別說一下我不想換行...) 我的意思是說 如果想要在這裡換行 請把 \n 寫進 printf 裡去 這支程式的 for 迴圈裡全部都沒有 \n 所以所有印出來的東西會擠在同一行 而之所以會誤以為有換行其實是你擺在中間的 scanf 的關係 這裡又是另一個問題: 在格式化輸出當中混進輸入的程式 這會很難掌握實際輸出的報表的樣子 基本上可以在表頭前面就用一個 for 來輸入資料 而不要像這支程式一樣把輸入混在報表輸出當中 這種寫法雖然不是說無法讓結果好看 但對一個初學者而言 輸出入分開處理在程式流程及結構的掌握上會比混在一起來得容易理解 (不過寫 online judge 則又是另外一回事了, 這裡表過不提) 第三個問題是第 6 行的陣列宣告 你應該有學到過陣列宣告時就需要給定大小 像這支程式一共有四個人的票數要計算 陣列大小就必須要開好 a[4] 在那裡 而不是寫 a[0] 然後自以為程式會幫你開好一切 講到 a b c 這三個陣列又是另一個問題 這種二維表格的資料最適合的是二維陣列 不過如果還沒學到二維陣列也沒關係 但至少不要取 a b c 這種你以後回來看還要想一下的名字 像是 ticket1 ticket2 ticket3 之類的名字都比 a b c 有意義多了 (第 7 行的 personTot 這個名字就是一個正面示範 看名字就知道這個陣列存的是各人的總票數) 最後再回到排版的問題上來 其實很多人似乎會誤解 \t 做為排版功能的用途 以為說只要擺上一個 \t 就一定會整齊 事實上 \t 會整齊的前提是不要有資料長過頭 這支程式就是一個最好的例子 假設這支程式已經改成輸出表格的部份當中 每個欄位之後都擺了一個 \t 那輸出結果會變成像是這樣: 歌星姓名 第一地區 第二地區 第三地區 總得票數 ======================================================================== 周華見 100 200 300 600 劉得華 110 220 330 660 張學有 120 240 360 720 梁朝為 130 260 390 780 這是由於 \t 其實只是把游標前進到下一個定位點而已 現在的 console 設定上定位點都是每 8 個 byte 一個 也就是以像這裡這個 80 字的寬度來說 定位點會在這些地方: 0 0 1 2 3 4 4 5 6 7 1 9 7 5 3 1 9 7 5 3 跟上面的輸出對比一下就會發現 當游標已經進到下一個定位點的時候 再輸出 \t 會讓游標更往後跳 例如輸出 " 歌星姓名" 之後 游標已經到了第 10 格 所以 \t 一跳就是第 17 格 但輸出 "周華見" 之後 游標只在第 7 格 所以 \t 只跳到第 9 格 這就是造成上面這樣的輸出的原因 解決的辦法 除非對輸出的資料有很大的把握 或是所輸出的 \t 不是拿來排表格 (例如輸出程式碼縮排的狀況) 或是那個輸出是給其他程式看 只吃 \t 不管實際上的排版的 要不然這種排版請用 %10s 這種方式指定輸出寬度 (這個應該有學到吧?) 這樣才能百分之百掌握所輸出的表格的大小 然後請不要用 \b 那個是特殊狀況才會用得到的 而且會跟你想像的結果不太一樣... 大致上就是這些問題了 -- LPH [acronym] = Let Program Heal us -- New Uncyclopedian Dictionary, Minmei Publishing Co. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.118.138.54

06/09 20:53, , 1F
好人推
06/09 20:53, 1F

06/09 21:22, , 2F
推好人!
06/09 21:22, 2F

06/09 21:50, , 3F
推(Y)
06/09 21:50, 3F

06/09 21:55, , 4F
06/09 21:55, 4F

06/10 00:28, , 5F
推推
06/10 00:28, 5F

06/10 01:14, , 6F
06/10 01:14, 6F

06/10 08:00, , 7F
謝謝詳檞 看來我誤會不少東西....推
06/10 08:00, 7F

06/14 08:05, , 8F
感謝 高手講解推一個!
06/14 08:05, 8F

06/14 15:41, , 9F
\b是退游標,並不會改變輸出結果
06/14 15:41, 9F

06/14 15:42, , 10F
要改已輸出的內容要"\b "輸出空白把之前的內容蓋掉
06/14 15:42, 10F

06/14 15:43, , 11F
我記得應該是這樣
06/14 15:43, 11F

06/17 09:49, , 12F
樓上正確, 所以我才會說"跟你想像的結果不太一樣"
06/17 09:49, 12F

06/17 09:49, , 13F
它並不是倒退鍵而比較像方向左鍵
06/17 09:49, 13F
文章代碼(AID): #1Hj7S4hq (C_and_CPP)
文章代碼(AID): #1Hj7S4hq (C_and_CPP)