Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在gdb中使用输入文件_C_Debugging_Gdb_Segmentation Fault - Fatal编程技术网

C 如何在gdb中使用输入文件

C 如何在gdb中使用输入文件,c,debugging,gdb,segmentation-fault,C,Debugging,Gdb,Segmentation Fault,我通常在编写程序时使用一个输入文件,这样我就不用一次又一次地输入数字了 这是我为快速排序编写的一个程序,有些地方给了我分段错误 #include<stdio.h> int partition (int *,int,int); void quicksort (int *,int,int); int main() { int i,j,a[15],choice; int length; printf("Entering numbers in array \n"); for(i=0;i<

我通常在编写程序时使用一个输入文件,这样我就不用一次又一次地输入数字了

这是我为快速排序编写的一个程序,有些地方给了我分段错误

#include<stdio.h>
int partition (int *,int,int);
void quicksort (int *,int,int);
int main()
{
int i,j,a[15],choice;
int length;
printf("Entering numbers in array \n");
for(i=0;i<=14;i++)
scanf("%d",&a[i]);
printf("the sorted array is\n");
length=sizeof(a);
quicksort(a,0,length-1);
for(i=0;i<=14;i++)
 printf (" %d ",a[i]);
}
int partition(int *num,int p,int r)
{
 int x,j,i,temp;
  x=num[r];
  i=-1;
  for(j=0;j<=r-1;j++)
  {
    if(num[j]<=x)
     {
      i=i+1;
       temp=num[i];
       num[i]=num[j];
       num[j]=temp;
     }
  }
  num[i+1]=num[r];
 return i+1;
}


void quicksort (int *num,int p,int r)
{
 int q;
 if (p<r)
  {
        q=partition(num,p,r);
        quicksort(num,p,q-1);
        quicksort(num,q+1,r);
  }
}
当我编译它如下

cc quicksort.c
./a.out < input.txt                                          
我想知道的是我经常使用gdb来调试这些问题。 在gdb中,我是否可能从同一个文件input.txt获取输入

43 12 90 3 49 108 65 21 9 8 0 71  66 81
我使用gdb的命令集是

cc -g quicksort.c
gdb
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) file a.out
(gdb) break quicksort.c:3
(gdb) run 
cc-gquicksort.c
gdb
GNU gdb(gdb)7.1-ubuntu
版权所有(C)2010免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。键入“显示复制”
和“显示保修”了解详细信息。
此GDB配置为“x86_64-linux-gnu”。
有关错误报告说明,请参阅:
.
(gdb)文件a.out
(gdb)打破快速排序。c:3
(gdb)运行

现在我想知道的是如何在gdb中使用输入文件,这样我就不会一次又一次地输入我想要输入的数组了?

在这种“常见”的用例中,谷歌总是你的朋友


出于调试目的,将此行添加到程序中,并注释掉第一个For循环

int a[] = {43, 12, 90, 3, 49, 108, 65, 21, 9, 8, 0, 71, 66, 81};
要获得最大限度的调试信息,请使用

gcc -ggdb3 qs.c
并在gdb中作为

gdb -q ./a.out 
永远不要退出你的gdb会话!如果您重新编译它,gdb将自动注意并重新加载二进制文件;通过这种方式,您将始终设置断点以及您创建的所有其他内容

由于其他人已经给了您一个问题所在的提示,我可能会展示一个公共宏来获取静态分配数组的大小:-)


seg故障的原因可能是这条线路

长度=尺寸f(a)

现在是60岁


你的最大r值应该是15。一个整数被分配4个字节。因此,您的呼叫溢出,因此出现错误。

为什么该线路是错误的?我知道整数是4字节,Ooo你的意思是说我应该使用strlen而不是sizeof..很好。我只是想知道如果我们有一个部分填充的数组,那么sizeof(a)/sizeof(a[0])将只返回那些被占用的成员的大小,或者返回所有15个,即60个/4@Registered用户。不能在整数类型上直接使用strlen。要获得大小,我建议提前询问大小并将其传递给函数。我也不明白部分填充数组是什么意思。如何区分“填充”数据和“未填充”数据?是的,我得到了宏是什么,我只是想知道,如果我没有填充所有15个索引,并且数组中只有一些数字被填充,那么在这种情况下,您的宏sizeof(x)将只返回填充的位置或所有15个位置所占用的空间,即60个字节。如果您静态地分配一个数组以包含14个项,如
a[14]
中所示,那么您将得到这样的结果。是否填充数组并不重要。它将包含未初始化的值,但仍有14个。与gdb一样。试试看!在gdb中,您可以调用任何宏/函数,即键入
p sizeof(a)
p sizeof(a)/sizeof(a)[0]
,然后查看输出。很好,我明白了您的意思。我刚刚编写了另一个简单的程序来查看宏的工作原理,我没有将数组填充为full,但它给了我full数组的大小。因此,这就产生了一个问题,我有没有办法知道int数组中有多少个位置填充了数字,也就是说,我不想知道完整数组的长度,只想知道输入了多少数字。不,不是真的,不是静态allays。您可以使用malloc/realloc动态分配它。对于静态数组,您可以在启动时使用已知值填充它并进行检查,但用户稍后可能会添加该值,从而破坏计数。问题是如何将输入文件管道化到可执行的
gdb -q ./a.out 
#define ARRAY_SIZE(x) (sizeof((x)) / sizeof((x)[0]))