练习如下:
编写程序,在第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);
}
}
}
答案 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
)
在我第一次尝试编写代码时,我发现模式blank->nonblank
越过最大行长度边界,需要在第一个空白字符处打破行,并记住读取的所有非空白字符远。在这种情况下,我最多需要存储的最大输出行长度(当我们达到最大行长并且必须断开行时,存储恰好在数据中的非空白字符),以及必须存储它们的最大输出行长度,就好像我得到更多,确保在该点之前必须断开该行。
我的第一次尝试是存储到目前为止读取的空白字符的数量,然后是最大输出行长度的缓冲区(不是输入行长度,这是无限制的,如问题中所指定的)。可能的状态将是:(遵循下一版页面)