新手简单c题目求解答!

愣一愣 2014-10-08 08:50:41
练习里的一道题目。
要求把较长的输入行“折”成短一些的两行或多行,折行位置在输出行的第n列之前的最后一个空格符之后。
要保证程序能够智能地处理输入行很长以及在指定的列前没有空格或制表符的情况。
运行结果只是打印了文字段最后的一小段,求大神解答!

#include<stdio.h>

#define N 10 /*一行最大字符数*/
#define TAB 8

char ss[N];

void printl(int pos);
int detab(int pos);
int findblank(int pos);
int newpos(int pos);

int main()
{ int c,pos=0;

while((c=getchar())!=0)
{ ss[pos]=c;
if(c=='\t')
pos=detab(pos);
else if(c=='\n')
{ printl(pos);
pos=0;
}
else if(++pos>=N)
{ pos=findblank(pos);
printl(pos);
pos=newpos(pos);
}
}
return 0;
}

void printl(int pos) /*打印字符函数*/
{ int i;
for(i=0;i<pos;i++)
putchar(ss[i]);
if(pos>0)
putchar('\n');
}

int detab(int pos) /*制表符转换空格符*/
{ ss[pos]=' ';
for(++pos;pos<N && pos%TAB!=0;++pos)
ss[pos]=' ';
if(pos>=N)
{ printl(pos);
pos=0;
}
return pos;
}

int findblank(int pos) /*倒退寻找一个空格*/
{ for(;pos>0 || ss[pos]!=' ';--pos);
if(pos==0)
return N;
else
return pos+1;
}

int newpos(int pos) /*下一行的位置起始*/
{ int j,i=0;
if(pos<=0 || pos>=N)
return 0;
else
for(j=pos;j<N;j++)
ss[i++]=ss[j];
return i;
}

...全文
197 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
愣一愣 2014-10-09
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
仅供参考
//输入一个小于200的字符串,将该字符串以“_”分割成小于20的字串。请输出原串和子串。
//请注意以下测试用例:
//·输入空串
//·输入长度为9的字符串
//·输入长度为19的字符串
//·输入长度为20的字符串
//·输入长度为38的字符串
//·输入长度为205的字符串
//·理论上还应该考虑输入串中包含_如何处理的逻辑(这个在我的代码中没有体现)
#include <stdio.h>
#include <string.h>
char s[201];
char d[11][21];
int i,L,n;
void main() {
    fgets(s,201,stdin);
    L=strlen(s);
    if ('\n'==s[L-1]) {s[L-1]=0;L--;}
    for (i=0;i<L;i++) {
        d[i/19][i%19]=s[i];
        if (i!=L-1 && 18==(i%19)) {
            d[i/19][19]='_';
            d[i/19][20]=0;
        }
    }
    d[i/19][i%19]=0;
    if (i>0 && 0==(i%19)) {
        n=i/19;
    } else {
        n=i/19+1;
    }
    printf("s=\"%s\"\n",s);
    for (i=0;i<n;i++) {
        printf("d[%2d]=\"%s\"\n",i,d[i]);
    }
}
程序好像有点超出我的理解能力了,不过谢谢了,留下来研究研究
赵4老师 2014-10-09
  • 打赏
  • 举报
回复
仅供参考
//输入一个小于200的字符串,将该字符串以“_”分割成小于20的字串。请输出原串和子串。
//请注意以下测试用例:
//·输入空串
//·输入长度为9的字符串
//·输入长度为19的字符串
//·输入长度为20的字符串
//·输入长度为38的字符串
//·输入长度为205的字符串
//·理论上还应该考虑输入串中包含_如何处理的逻辑(这个在我的代码中没有体现)
#include <stdio.h>
#include <string.h>
char s[201];
char d[11][21];
int i,L,n;
void main() {
    fgets(s,201,stdin);
    L=strlen(s);
    if ('\n'==s[L-1]) {s[L-1]=0;L--;}
    for (i=0;i<L;i++) {
        d[i/19][i%19]=s[i];
        if (i!=L-1 && 18==(i%19)) {
            d[i/19][19]='_';
            d[i/19][20]=0;
        }
    }
    d[i/19][i%19]=0;
    if (i>0 && 0==(i%19)) {
        n=i/19;
    } else {
        n=i/19+1;
    }
    printf("s=\"%s\"\n",s);
    for (i=0;i<n;i++) {
        printf("d[%2d]=\"%s\"\n",i,d[i]);
    }
}
愣一愣 2014-10-09
  • 打赏
  • 举报
回复
引用 2 楼 u012421456 的回复:
说实话,并不太明白你说的题意 [quote=引用 楼主 WJ_Local 的回复:] 把较长的输入行“折”成短一些的两行或多行,折行位置在输出行的第n列之前的最后一个空格符之后。 要保证程序能够智能地处理输入行很长以及在指定的列前没有空格或制表符的情况。
[/quote] 题目要求: 输入“i am a student welcome to c world" 打印"i am a \nstudent \nwelcome \nto c world\n" 程序实际运行: 输入"i am a stuent" 打印" a stuent"
愣一愣 2014-10-09
  • 打赏
  • 举报
回复
引用 2 楼 u012421456 的回复:
说实话,并不太明白你说的题意 [quote=引用 楼主 WJ_Local 的回复:] 把较长的输入行“折”成短一些的两行或多行,折行位置在输出行的第n列之前的最后一个空格符之后。 要保证程序能够智能地处理输入行很长以及在指定的列前没有空格或制表符的情况。
[/quote]就是我输入"i am a student"程序就打印 "i am a student"
愣一愣 2014-10-09
  • 打赏
  • 举报
回复
引用 1 楼 u012421456 的回复:
16行到29行的while循环,如果c不为\t、\n且else if(++pos>=N)不成立,你看会怎样
不成立的话就在循环一次
百曉生 2014-10-08
  • 打赏
  • 举报
回复
说实话,并不太明白你说的题意
引用 楼主 WJ_Local 的回复:
把较长的输入行“折”成短一些的两行或多行,折行位置在输出行的第n列之前的最后一个空格符之后。 要保证程序能够智能地处理输入行很长以及在指定的列前没有空格或制表符的情况。
百曉生 2014-10-08
  • 打赏
  • 举报
回复
16行到29行的while循环,如果c不为\t、\n且else if(++pos>=N)不成立,你看会怎样

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧