【发布时间】:2014-05-12 08:37:30
【问题描述】:
我有这样的问题: 编写一个程序来读取多行文本文件并将“N”个最长的行写入标准输出。在命令行中指定要读取的文件的位置。
现在我这样编写程序:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
int a,k,n,i=0,j;
int part;
char ar[1000][1000],str[1000];
/* char file[200]; */
/* scanf("%s",file); */
FILE *f = fopen(argv[1],"r");
if ( f == NULL || argc < 2)
{
return 0;
}
fscanf(f,"%d",&a);
while (fscanf(f,"%s",str)==1)
{
strcpy(ar[i++],str);
for ( k = 0 ; k < i ; k++ )
{
for ( j = k ; j < i ; j++)
{
if ( strlen(ar[k]) < strlen(ar[j]))
{
strcpy(str,ar[k]);
strcpy(ar[k],ar[j]);
strcpy(ar[j],str);
}
}
}
}
for ( j = 0 ; j < a ; j++ )
{
puts(ar[j]);
}
return 0;
}
首先它对我来说运行良好,但在提交时它给了我运行时错误。 其次,我想使用指针和动态分配内存来做到这一点。我该怎么做?
对不起,我睡了一会儿。你能解释一下我的代码有什么问题吗?为什么它不起作用。我想没有人解释我哪里做错了。请让我知道在发布我的问题几个小时后如何引起人们的注意。再次感谢大家给我这么多时间。
【问题讨论】:
-
您具体看到了什么运行时错误?请将实际的错误消息复制并粘贴到您的问题中。
-
网站未指定任何错误。
-
只需使用
malloc(size)分配内存,使用动态内存几乎与使用常规数组相同。只是不要忘记释放您分配的内存。动态分配不会节省内存,但允许您使用比您可以放入堆栈更长的数组。 -
@EliasVanOotegem - 它将占用一个额外的指针和几个字节的分配数据 - 相对于整体内存使用量略有增加。至于访问 - 这真的取决于编译器的性能。如果直接作为堆栈偏移量访问而不是从堆栈偏移量处的指针取消引用,堆栈数组可能会更快。无论如何,堆栈空间通常非常有限,因此我不会将动态内存分配作为一种不好的做法。
-
@jahan 您正在访问
argv[1]之前您检查argc是否足够大。如果程序在没有任何参数的情况下运行,则会触发未定义的行为。