[英]Kernighan and Ritchie C exercise 1-16
我試圖為 K&R 書中的 C 語言練習實現一個解決方案。 我想問這里是否可以將這視為合法的“解決方案”,只需修改main
而不更改外部函數內部的內容。
修改最長行程序的主程序,使其正確打印任意長輸入行的長度,以及盡可能多的文本。
#include <stdio.h>
#define MAXLINE 2 ////
int get_line1(char s[], int lim)
{
int c, i;
for (i = 0; i < lim - 1 && ((c = getchar()) != EOF) && c != '\n'; i++) {
s[i] = c;
}
if (c == '\n') {
s[i] = c;
i++;
}
s[i] = '\0';
return i;
}
int main()
{
int len;
int max = MAXLINE;
char line[MAXLINE];
int tot = 0;
int text_l = 0;
while ((len = get_line1(line, max)) > 0) {
if (line[len - 1] != '\n') {
tot = tot + len;
}
if (line[1] == '\n' || line[0] == '\n') {
printf("%d\n", tot + 1);
text_l = text_l + (tot + 1);
tot = 0;
}
}
printf("%d\n", text_l);
}
這個想法是為數組line
ad 2 設置考慮的字符串的最大長度。對於abcdef\\n
字符串,數組line
是ab
。 由於數組的最后一個元素不是\\n
(因此我們正在考慮的行還沒有結束),我們保存直到現在的長度並重復循環。 然后我們將得到由cd
的數組,然后是ef
,最后我們將得到只有\\n
的數組。 然后, else if
條件被執行,因為此數組的第一個元素是\\n
,我們打印tot
從以前的加法得到的長度。 我們添加 +1 也是為了考慮新字符\\n
。 這也適用於奇數字符串:使用abcdefg\\n
過程將繼續,直到我們到達g\\n
並且求和正確完成。
在循環之外,然后我們打印文本的總量。
這是做練習的正確方法嗎?
練習說要“修改主程序”,但是您更改了MAXLINE
的定義,該定義在main
之外,因此這不是有效的解決方案。
此外,您的代碼沒有原始代碼的copy
或getline
例程。 除了名稱外,您的get_line1
似乎完全相同。 但是,更正解決方案將使用相同的源代碼,除了main
的代碼。
此外,練習說要打印“盡可能多的文本”。 這沒有明確說明,但我希望這意味着保留MAXLINE
字符的緩沖區( MAXLINE
為其原始值 1000)並使用它來打印最長行的第一個MAXLINE
-1 個字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.