- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是一名 Delphi、Ruby 和 Javascript 程序员,终于开始学习 C - 从 K&R 开始。我正在尽最大努力不要跳到前面去使用尚未介绍的库和概念。由于这是教程的第一章,我只坚持使用一些语言功能,并希望保持这种状态。
1-22 不熟悉:
Write a program to ``fold'' long input lines into two or more shorter lines after the last non-blank character that occurs before the n-th column of input.
Make sure your program does something intelligent with very long lines, and if there are no blanks or tabs before the specified column.
我在没有寻求外部帮助的情况下达到了 1-22,但我一直在努力解决 1-22 的“大部分”工作版本。我认为我的算法..erm..选择很糟糕。
到目前为止,我已经决定将输入折叠到 40 个字符。使用整数除法(/和模数 %),我计算出每行需要折叠多少次,跳转到该列并向后计数,直到遇到空格。空格被替换为“\n”。重复 +40 个字符。
如果没有遇到空格,我们将在每个列停止处进行硬折叠。
我发现有些线偷偷越过了我的边界,想知道我是否不应该这样做将输入读入 char line[],然后一次将 40 个字符复制到缓冲区,折叠缓冲区,然后将缓冲区复制回 line[]..但这似乎是一项繁重的工作,尤其是在没有 string 的情况下。 h
代码在下面,我正在寻找正确方向的提示与解决方案,因为我认为我快到了。
#include <stdio.h>
#define MAXBUF 1000
#define WRAP 20
int getline(char s[],int lim);
int main(void)
{
int len; /* length of each input */
int folds; /* how many folds we've performed */
int lines; /* lines the input breaks down to given len */
int index; /* index of fold */
int didfold; /* true (1) if we were able to fold on a ' ' */
int i; /* loop counter */
char line[MAXBUF+1]; /* input line */
char buf[MAXBUF+1]; /* temp buffer for copying */
while ((len=getline(line,MAXBUF)) > 0)
{
/* how many times should we fold the input
account for left overs
*/
lines = len / WRAP;
if (len % WRAP != 0)
++lines;
/* init */
folds = 1;
while (lines>0)
{
didfold = 0;
for (index=(WRAP*folds)-1;index>0 && !didfold;--index)
{
if (line[index] == ' ')
{
line[index] = '\n';
didfold = 1;
--lines;
++folds;
}
}
// if (!didfold)
// {
// i = 0;
// while ((buf[i] = line[i]) != '\0');
// ++i;
// for(index=i=0;buf[i]!='\0';++index,++i)
// {
// line[index] = buf[i];
// if (index==(WRAP*folds))
// {
// ++i;
// line[i] = '\n';
// didfold = 1;
// ++folds;
// linelength -= WRAP * folds;
// }
// }
// }
}
printf("--------------------|||||\n");
printf("%s",line);
}
return 0;
}
int getline(char s[],int lim)
{
int i,c;
for (i=0;i<=lim && ((c = getchar()) != EOF) && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = '\n';
++i;
}
s[i] = '\0';
return i;
}
我有另一个版本将自身索引到 column - 40
并向前计数更多问题。
更新
以下是我正在解决的错误,所以我远未完成,但是..
我的方向是否正确?我想确保我掌握了经典UNIX 文本过滤器。到目前为止,这段代码感觉好多了,但仍然很糟糕——我只是不喜欢感觉我掌握了一个关键概念,但需要用漂亮的代码来完成它..
/* Exercise 1-22. Write a program to ``fold'' long input lines into two or more shorter
lines after the last non-blank character that occurs before the n-th column of input.
Make sure your program does something intelligent with very long lines, and if there
are no blanks or tabs before the specified column. */
#include <stdio.h>
#define WRAP 20
int main(void)
{
char buf[WRAP+1];
int bufpos = 0;
int last_whitespace = -1;
for(bufpos=0;bufpos<(WRAP-1);++bufpos) {
putchar('-');
}
putchar('|');
putchar('\n');
bufpos=0;
while ((buf[bufpos]=getchar())!=EOF) {
// if at buffer or newline
if (bufpos==(WRAP-1) || buf[bufpos] == '\n' || buf[bufpos] == '\t') {
++bufpos;
buf[bufpos] = '\0';
if (buf[bufpos]==' ' || buf[bufpos] == '\n') {
// whitespace, flush buf and go.
printf("%s",buf);
} else {
if (last_whitespace>0) {
buf[last_whitespace] = '\n';
printf("%s",buf);
} else {
//hard fold!
printf("%s",buf);
putchar('\n');
}
}
for (bufpos=0;bufpos<WRAP;++bufpos)
buf[bufpos] = '\0';
bufpos=0;
last_whitespace=-1;
} else {
if (buf[bufpos]==' ')
last_whitespace = bufpos;
++bufpos;
}
}
return 0;
}
最佳答案
逐个字符地通读每一行,并维护一些指针(或者,如果您还没有使用指针,则保留偏移量)。一个用于“行的开头”,它将从指向行的开头开始,一个用于您看到的最后一个空格,它将从 NULL 开始(如果您使用的是偏移量,则 -1 会代替),一个用于当前阅读位置。
然后,每当遇到一些空白时,您应该检查是否可以输出从前一个空白到(但不包括)当前空白的所有内容,而不会超出 WRAP
字符。如果可以,那就马上输出,更新之前的空白指针指向当前的空白。如果不能,则输出一个换行符而不是之前的空格,并更新行首指针和最后一个空格指针。
现在唯一剩下的就是“处理非常长的行”,你可以通过查看行的开头和看到的最后一个空格是否都在同一个地方来做到这一点,但我们仍然 超出了 WRAP
列 — 这意味着我们有一个词无法放在一行中。在那种情况下,我们可能应该在这里插入一个换行符,重置行首,然后继续。
确保在到达输入行的末尾时还打印任何尚未打印的内容,并输出最后的换行符。
这个算法的好处是它实际上不需要一组行来工作——因为它是逐个字符地处理的,所以它可以在一次读取输入文件一个字符的情况下进行很小的更改,给定至少包含 WRAP
个字符的缓冲区。
关于C编程的(K&R 1-22)折叠输入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5228209/
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我们可以说 O(K + (N-K)logK)相当于O(K + N logK)对于 1 < = K <= N ? 最佳答案 简短的回答是它们不等价,这取决于k 的值。如果k等于N,那么第一个复杂度是O(
我有以下解决方案,但我从其他评论者那里听说它是 O(N * K * K),而不是 O(N * K)其中 N 是 K 列表的(最大)长度,K 是列表的数量。例如,给定列表 [1, 2, 3] 和 [4,
我试图理解这些语法结构之间的语义差异。 if ((i% k) == (l % k) == 0) 和 if ((i % k) == 0 && (l % k) == 0) 最佳答案 您的特定表达式((i
我有时会使用一维数组: A = np.array([1, 2, 3, 4]) 或 2D 阵列(使用 scipy.io.wavfile 读取单声道或立体声信号): A = np.array([[1, 2
在文档聚类过程中,作为数据预处理步骤,我首先应用奇异向量分解得到U、S和Vt 然后通过选择适当数量的特征值,我截断了 Vt,这让我从阅读的内容中得到了很好的文档-文档相关性 here .现在我正在对矩
我问的是关于 Top K 算法的问题。我认为 O(n + k log n) 应该更快,因为……例如,如果您尝试插入 k = 300 和 n = 100000000,我们可以看到 O(n + k log
这个问题与另一个问题R:sample()密切相关。 。我想在 R 中找到一种方法来列出 k 个数字的所有排列,总和为 k,其中每个数字都是从 0:k 中选择的。如果k=7,我可以从0,1,...,7中
我目前正在评估基于隐式反馈的推荐系统。我对排名任务的评估指标有点困惑。具体来说,我希望通过精确度和召回率来进行评估。 Precision@k has the advantage of not requ
我在 Python 中工作,需要找到一种算法来生成所有可能的 n 维 k,k,...,k 数组,每个数组都沿轴有一行 1。因此,该函数接受两个数字 - n 和 k,并且应该返回一个数组列表,其中包含沿
我们有 N 对。每对包含两个数字。我们必须找到最大数 K,这样如果我们从给定的 N 对中取 J (1 2,如果我们选择三对 (1,2),我们只有两个不同的数字,即 1 和 2。 从一个开始检查每个可能
鉴于以下问题,我不能完全确定我当前的解决方案: 问题: 给定一个包含 n 元素的最大堆,它存储在数组 A 中,是否可以打印所有最大的 K 元素在 O(K*log(K)) 中? 我的回答: 是的,是的,
我明白了: val vector: RDD[(String, Array[String])] = [("a", {v1,v2,..}),("b", {u1,u2,..})] 想转换成: RDD[(St
我有 X 个正数,索引为 x_i。每个 x_i 需要进入 K 组之一(其中 K 是预先确定的)。令 S_j 为 K_j 中所有 x_i 的总和。我需要分配所有 x_i 以使所有 S_j 的方差最小化。
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我正在研究寻找原始数的算法,看到下面的语句,我不明白为什么。 while (k*k <= n) 优于 while (k <= Math.sqrt(n)) 是因为函数调用吗?该调用函数使用更多资源。 更
我想找到一种尽可能快的方法来将两个小 bool 矩阵相乘,其中小意味着 8x8、9x9 ... 16x16。这个例程会被大量使用,所以需要非常高效,所以请不要建议直截了当的解决方案应该足够快。 对于
有没有一种惯用的方法来获取 Set和 Function ,并获得 Map实时取景? (即 Map 由 Set 和 Function 组合支持,例如,如果将元素添加到 Set ,则相应的条目也存在于 M
这个问题在这里已经有了答案: Can a local variable's memory be accessed outside its scope? (20 个答案) returning addr
给定一个矩阵:- k = [1 2 3 ; 4 5 6 ; 7 8 NaN]; 如果我想用 0 替换一个数字,比如 2,我可以使用这个:k(k==2) =
我是一名优秀的程序员,十分优秀!