C编程int readlines(char *lineptr[],int nlines);输入并打印字符串

来源:百度知道 编辑:UC知道 时间:2024/06/04 01:53:04
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 5000
char *lineptr[max];
int readlines(char *lineptr[],int nlines);

main()
{ int n;
int nlines;
if((nlines=readlines(lineptr,max))>=0)
for(n=0;n<nlines; )
puts(*lineptr++);
}
#define maxlen 1000

int readlines(char *lineptr[],int maxlines)
{
int len,nlines;
char *p,line[maxlen];
nlines=0;
while((len=getline(line,maxlen))>0)
if(nlines>=maxlines)
return -1;
else{
line[len-1]='\0';
strcpy(p,line);
lineptr[nlines++]=p;
}
return nlines;

}
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;
}
s[i]='\0';
return i

先把一二楼的错误总结一下吧:
1、getline 的调用应在其定义之后,所以你应该将getline的定义放readllines定义的前面。这应该是笔者的小小疏忽了吧。
2、readlines函数中strcpy(p,line);这句,指针p没有申请空间,会造成内存溢出。
但是你的程序还是存在还多问题的请看程序了。你的本意是把用户每输入的以回车为准的字符串输出到屏幕上,直到用户只输入回车符或者超过了系统预定的最大行maxlines时停止。这时只打印最后一行以前的。因为你的程序是先输入在判断了,所以第二中结束的情况就属于这了。呵呵~~~不知道懂哈

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 3 /*为了测试,缩小数量。下同*/
char *lineptr[max]; /*全局变量,只是说明定义了max个字符串指针,用来指向某某的,并不用初始化之类的。*/
int readlines(char *lineptr[],int nlines);
int getline(char s[],int lim);
main()
{
int n;
int nlines;
if((nlines=readlines(lineptr,max))>=0)
for(n=0;n<nlines;n++)/*是不是少了n++呢*/
/* puts(*lineptr++);*//*原来你用的是这句,这就是一个相当致命的错误,和你问题补充的是一种原因。lineptr是字符串指针常量,地址不变的,是不可以进行自增自减操作的。类似于a=10++,你见过吗,呵呵~。而指针变量是可以随意改变指向的。因此,问题补充的你该懂了吧。好好查查书看看了。修改后的结果如下,只是让它的下标来移动而已*/
puts(lineptr[n]);
getch();
}
#define maxlen 10

int readl