关于 一行行的读取输入行,直到文件尾. 算出每行长度,然后打印最长行 的三个有关问题.
关于 一行行的读取输入行,直到文件尾. 算出每行长度,然后打印最长行 的三个问题...
编写一个程序,一行行的读取输入行,直到文件尾. 算出每行长度,然后打印最长行,假定每行不超过1000
迷惑1) 我的思路是构造个二维数组, 于是就想 char [1000][]; 但发现这样的话根本就不给定义,因为不确定到底有多少行...
迷惑2) 如果char a[10] 然后 给a 赋个hello 那他后面的字符全为 空格还是 为\0 ?
迷惑3)而且文件尾EOF 怎么表示呢. 用ctrl+d也不终止.
最后麻烦哪个达人帮我写个正确的程序出来. 研究了一天了 不知道怎么弄
------解决方案--------------------
char [1000][]; ?
char [][1000]
如果一开始不知道多长,可以试着这样做。
比如先定义10*10(行长)的长度,当用到8个时,发现还没读完,可以再扩充一点。
如果char a[10] 然后 给a 赋个hello
hello是个字符串,赋到o的时候,会加个'\0'
而且文件尾EOF 怎么表示呢.
这个忘记了。 大概是 getchar()!=EOF
不过本题可以不要分配内存数组
流程可以这样
分配足够的两段内存,用来存放从文件读的内容和最后结果
定义两个个长度变量,上一次长度和当前长度
开文件流
while(getchar()!=EOF) //好象是这样,我也忘记了。。。不对指出
{
getline();
把长度放入当前长度;
与上一次长度对比,如果大于他
1就把此次读到的长度赋给上一次,2把这行内容放到最后结果的那段内存
否则继续取
}
善后工作。。
------解决方案--------------------
应该是char x[][1000],或者char*x[]吧
EOF好像不能直接输入
这个题其实用不着用二维数组的吧,简单的写个例子,可能有点错误,自己看下吧
#include <stdio.h>
#define MAXLINE 20
int getline(char s[], int lim);
void copy(char to[], char from[]);
int main(void)
{
char line[MAXLINE];
char longest[MAXLINE];
int len, max;
max=0;
while((len = getline(line, MAXLINE)) > 1)
if(len>max)
{
max=len;
copy(longest,line);
}
if(max>0)
printf("%s",longest);
system("pause");
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;
}
else if(c == EOF && i > 0)
{
s[i] = '\n';
++i;
}
s[i] = '\0';
return i;
}
void copy(char to[], char from[])
{
int i;
i = 0;
while((to[i] = from[i]) != '\0')
++i;
}
编写一个程序,一行行的读取输入行,直到文件尾. 算出每行长度,然后打印最长行,假定每行不超过1000
迷惑1) 我的思路是构造个二维数组, 于是就想 char [1000][]; 但发现这样的话根本就不给定义,因为不确定到底有多少行...
迷惑2) 如果char a[10] 然后 给a 赋个hello 那他后面的字符全为 空格还是 为\0 ?
迷惑3)而且文件尾EOF 怎么表示呢. 用ctrl+d也不终止.
最后麻烦哪个达人帮我写个正确的程序出来. 研究了一天了 不知道怎么弄
------解决方案--------------------
char [1000][]; ?
char [][1000]
如果一开始不知道多长,可以试着这样做。
比如先定义10*10(行长)的长度,当用到8个时,发现还没读完,可以再扩充一点。
如果char a[10] 然后 给a 赋个hello
hello是个字符串,赋到o的时候,会加个'\0'
而且文件尾EOF 怎么表示呢.
这个忘记了。 大概是 getchar()!=EOF
不过本题可以不要分配内存数组
流程可以这样
分配足够的两段内存,用来存放从文件读的内容和最后结果
定义两个个长度变量,上一次长度和当前长度
开文件流
while(getchar()!=EOF) //好象是这样,我也忘记了。。。不对指出
{
getline();
把长度放入当前长度;
与上一次长度对比,如果大于他
1就把此次读到的长度赋给上一次,2把这行内容放到最后结果的那段内存
否则继续取
}
善后工作。。
------解决方案--------------------
应该是char x[][1000],或者char*x[]吧
EOF好像不能直接输入
这个题其实用不着用二维数组的吧,简单的写个例子,可能有点错误,自己看下吧
#include <stdio.h>
#define MAXLINE 20
int getline(char s[], int lim);
void copy(char to[], char from[]);
int main(void)
{
char line[MAXLINE];
char longest[MAXLINE];
int len, max;
max=0;
while((len = getline(line, MAXLINE)) > 1)
if(len>max)
{
max=len;
copy(longest,line);
}
if(max>0)
printf("%s",longest);
system("pause");
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;
}
else if(c == EOF && i > 0)
{
s[i] = '\n';
++i;
}
s[i] = '\0';
return i;
}
void copy(char to[], char from[])
{
int i;
i = 0;
while((to[i] = from[i]) != '\0')
++i;
}