K& R练习1-22提示

时间:2016-02-21 19:57:39

标签: c

练习如下:

  

编写程序,在第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);
        }
    }


}

2 个答案:

答案 0 :(得分: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

可能存在其他问题

答案 1 :(得分:0)

这项练习有点挑战性。

首先,您根本不需要缓冲,因为您只有两种读取字符(空白/非空白),而对于非空白字符,您始终需要打印它,因此您的主循环可以像是

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

(K&amp; R中所有练习的风格都写得很多)

看一下当输入空白字符时,你只需要计算它们,并在\n输入上重置计数器。

当你要求不透露最终解决方案时,我会对此做出承诺,但诀窍是在读取行时对字符进行计数,在非黑名单上输出(并计数)而不输出(但仅计数)在空白字符上。如果读取的字符为空白且您已超过限制,则您将折叠该行(发出\n

第1版

在我第一次尝试编写代码时,我发现模式blank->nonblank越过最大行长度边界,需要在第一个空白字符处打破行,并记住读取的所有非空白字符远。在这种情况下,我最多需要存储的最大输出行长度(当我们达到最大行长并且必须断开行时,存储恰好在数据中的非空白字符),以及必须存储它们的最大输出行长度,就好像我得到更多,确保在该点之前必须断开该行。

我的第一次尝试是存储到目前为止读取的空白字符的数量,然后是最大输出行长度的缓冲区(不是输入行长度,这是无限制的,如问题中所指定的)。可能的状态将是:(遵循下一版页面)