這裏是我的,我是工作在今天的樂趣在C:
這裏是我的考慮:
1)字符的任何拷貝,只是打印到標準輸出。因此,由於我不喜歡修改argv [x]參數,並且因爲我喜歡挑戰,所以我想在不修改它的情況下做到這一點。我沒有去插入'\n'
的想法。
2)我不想
This line breaks here
成爲
This line breaks
here
因此更改字符'\n'
沒有給出這一目標的選項。
3)如果線寬設置爲80,並且第80個字符位於單詞的中間,則整個單詞必須放在下一行。所以當你掃描的時候,你必須記住最後一個字沒有超過80個字符的位置。
所以這裏是我的,它不乾淨;在過去的一個小時裏,我一直在努力讓它工作,在這裏和那裏添加一些東西。它適用於我所知道的所有邊緣情況。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int isDelim(char c){
switch(c){
case '\0':
case '\t':
case ' ' :
return 1;
break; /* As a matter of style, put the 'break' anyway even if there is a return above it.*/
default:
return 0;
}
}
int printLine(const char * start, const char * end){
const char * p = start;
while (p <= end) putchar(*p++);
putchar('\n');
}
int main (int argc , char ** argv) {
if(argc <= 2) exit(1);
char * start = argv[1];
char * lastChar = argv[1];
char * current = argv[1];
int wrapLength = atoi(argv[2]);
int chars = 1;
while(*current != '\0'){
while(chars <= wrapLength){
while (!isDelim(*current)) ++current, ++chars;
if(chars <= wrapLength){
if(*current == '\0'){
puts(start);
return 0;
}
lastChar = current-1;
current++,chars++;
}
}
if(lastChar == start)
lastChar = current-1;
printLine(start,lastChar);
current = lastChar + 1;
while(isDelim(*current)){
if(*current == '\0')
return 0;
else
++current;
}
start = current;
lastChar = current;
chars = 1;
}
return 0;
}
所以基本上,我有start
和lastChar
我想設置爲線的開始和行的最後一個字符。當這些被設置時,我輸出到標準輸出所有字符從開始到結束,然後輸出一個'\n'
,並繼續到下一行。
最初一切指向開始,然後我跳過while(!isDelim(*current)) ++current,++chars;
的單詞。當我這樣做時,我記得80個字符之前的最後一個字符(lastChar
)。
如果在一個單詞的末尾,我已經通過了我的字符數(80),那麼我將跳出while(chars <= wrapLength)
塊。我輸出了start
和lastChar
和newline
之間的所有字符。
然後我將current
設置爲lastChar+1
並跳過分隔符(如果這導致我到字符串的末尾,我們就完成了,return 0
)。將start
,lastChar
和current
設置爲下一行的開頭。
的
if(*current == '\0'){
puts(start);
return 0;
}
部分是太短要甚至一度包裹字符串。我在寫這篇文章之前就添加了這個,因爲我嘗試了一個簡短的字符串,但它不起作用。
我覺得這可能是更好的方式可行。如果有人有任何建議,我很樂意嘗試。
而當我寫這篇文章的時候,我問自己「如果我的字符串是比我的長度長的字符,會發生什麼事情」,那麼它不起作用。所以我以前printLine()
語句添加
if(lastChar == start)
lastChar = current-1;
(如果lastChar
沒有移動,那麼我們有一個詞是單行過長,所以我們只要把整個事情就行了反正) 。
自從我寫這篇文章以來,我把註釋從代碼中拿出來了,但我真的覺得必須有更好的方法來做到這一點,而不是我所不需要的評論。
這就是我寫這個東西的故事。我希望它對人們有用,我也希望有人會不滿意我的代碼,並提出一個更優雅的方式。
應當指出的是,它適用於所有的邊緣情況:單詞太長的線,即短於一個wrapLength字符串和空字符串。
問題沒有明確規定,它是固定寬度的字體,雖然例子,在「文本編輯器」意味着使用它。只有雅科夫埃利斯的回答提到非固定寬度字體的文字換行。 – Gnubie 2012-05-01 16:27:10