K&R练习1-22提示

3
练习内容如下:
编写一个程序,在输入的第n列之前的非末尾空白字符后,将长输入行“折叠”为两个或更多较短的行。确保你的程序对非常长的行做出智能处理,并且如果在指定的列之前没有空格或制表符,则也要进行处理。
我的问题是如何实现foldStrings函数。我尝试了一些方法,但都不起作用。
你能给我一些提示吗?但请不要写出解决方案,我想自己想出来。
我已经编写了一些代码,但是在折叠部分卡住了。
#include <stdio.h>
#include <string.h>

int getline(char s[], int lim);
void emptystring(char s[]);
void foldStrings(char s[],int len);
int main(){
        int len ;
        char line[255];
        while((len = getline(line,255))>0)
               {
                    foldStrings(line,len);
               }

return 0;
}
int getline(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;
    }
    return i;
}

void foldStrings(char s[], int len)
{


}
void emptystring(char s[])
{
        int i;
        int len = strlen(s);
        for( i = 0 ; i < len ; ++i){
            s[i] = 0 ;
        }
}

我卡在了foldStrings函数上。

P.S. 我正在使用空字符串函数来打印行,所以先打印一条分段线,然后清空它,再次填充并打印它,如此往复


更新

我尝试做foldStrings,这是我的其中一个实现

void foldStrings(char s[], int len)
{
    int i  ;
    char temp[255];
    for(i = 1;i < len-1 ;++i)
    {
        if( i % 16 != 0)
        {
            temp[i-1] = s[i-1];
        }
        else if(i%16 == 0)
        {
            printf("%s",temp)
            emptystring(temp);
        }
    }


}

究竟哪里出了问题? - arc_lupus
尝试了一些想法,但都没有奏效。 - Gent Binaku
1
你尝试了什么?它们为什么不起作用?请展示你最好的代码,并解释它为什么不起作用。也许你应该展示一些样本数据(5行就足够了)。你计划在测试中使用多少宽度?(20-30个字符范围内可能是一个不错的选择。) - Jonathan Leffler
折叠通常在单词级别上完成,因此不要一次读取整行或一个字符,而是一次读取一个单词,并仅检查它是否适合当前行,在不适合时才转到下一行。如果单词长度超过当前行长度,则只需在中间拆分单词。 - zubergu
2个回答

0

这个练习有点具有挑战性。

起初,您根本不需要缓冲,因为您只有两种读取字符(空格/非空格),对于非空格字符,您总是必须打印它,因此您的主循环可以是以下内容:

while((c = getchar()) != EOF) {
    ...
}

(K&R中所有练习的风格都是这样写的)

注意,当输入空格字符时,您只需计数它们,并在输入 \n 时重置计数器。

由于您要求不要透露最终解决方案,因此我只会在其中进行承诺,但技巧是在读取行时计算字符,在非空格上输出(并计数),在空格字符上不输出(但仅计数)。如果读取的字符是空格且已经超过限制,则会折叠行(发出 \n

第1版

在我第一次尝试编写代码时,我发现模式 blank->nonblank 超过最大行长度边界,需要在第一个空格字符处断开行,并记住到目前为止读取的所有非空格字符。在这种情况下,我需要至多使用最大输出行长度的存储空间(以存储在达到最大行长度并必须断开行时存在于数据中的非空格字符),并且必须存储它们的最大输出行长度,如果我获得更多,那么肯定必须在该点之前断开该行。

我的第一次尝试将是存储到目前为止读取的空白字符数,然后是最大输出行长度的缓冲区(输入行长度不受限制,如问题所述)。可能的状态将是:(请参阅下一页的版本)


0

getline() 完成时,s 不一定以空字符结尾。

    // for( i = 0 ; i < lim-1 && ...
    for( i = 0 ; i < lim-2 && ( c = getchar()) != EOF && c !='\n';++i)

    ...

    s[i] = '\0'; // add
    return i;

foldStrings()也是一样的。缺少空字符。

    temp[i-1] = s[i-1];
    temp[i] = '\0'; // add

其他问题可能存在


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接