2017-09-16 65 views
2

争取做this Big Sorting problem on Hackerrank。我知道有写的算法更简单的方法,但我想刷了我的C知识,因此想挑战自己,写了二叉搜索树的问题。赛格故障 - 大排序

二叉搜索树我写的,似乎为整数的工作,但是,这个问题有串的数字形式输入类型。所以我试着将它改为使用字符数组,并且strcmp()为了比较数字串。

有人可以帮助我弄清楚是怎么回事,我怎么可能能够解决这个问题?

赛格故障:

GDB trace: 
Reading symbols from solution...done. 
[New LWP 11287] 
Core was generated by `solution'. 
Program terminated with signal SIGSEGV, Segmentation fault. 
#0 strlen() at ../sysdeps/x86_64/strlen.S:106 
#0 strlen() at ../sysdeps/x86_64/strlen.S:106 
#1 0x00007f4f76b2e455 in __strcpy_chk (dest=0xfb0020 "", src=0x0, 
    destlen=105) at strcpy_chk.c:28 
#2 0x00000000004007e3 in strcpy (__src=0x0, __dest=<optimized out>) 
    at /usr/include/x86_64-linux-gnu/bits/string3.h:110 
#3 create_node (key=0x0) at solution.c:25 
#4 0x00000000004006af in main() at solution.c:70 

代码:

​​

回答

1

你传递一个未初始化的指针scanf()读取一个字符串。而应该定义input为数组:

int main(void) { 
    // Enter your code here. Read input from STDIN. Print output to STDOUT 
    int i, n; 
    char input[105]; 
    Node *tree = NULL; 

    if (scanf("%d", &n) == 1) { 
     for (i = 0; i < n; i++) { 
      if (scanf("%104s", input) != 1) 
       break; 
      tree = insertNode(tree, input); 
     } 
     printTree(tree); 
    } 
    return 0; 
} 

这种方法的问题是,它不适合的问题空间:

  • 该网站说,行包含十进制编码数没有前导零,但长达10个字节。你不能用`scanf()来轻松高效地分析这样的输入。
  • 此外,strcmp()是不恰当的比较,这些项:您应该先比较长,只有在项目使用strcmp()具有相同的位数。
+0

明白了,这是有道理的。而'%104s' - 是必要的,还是只是增加了预防措施,我们没有占用太多内存? – Adjit

+0

硬编码104种破坏了使用MAXLEN定义的目的。 – Dukeling

+0

@Dukeling:是的,'的scanf()'是如此笨拙的我应该破除的定义。 – chqrlie

1

这里重点:

char *input; 
for (i = 0; i < n; i++) { 
    scanf("%s", input); 
} 

会在哪里读的字符串将被存储在哪里? inputchar指针不指向有效内存空间附近的任何位置!

让我们将其定义为一个数组分配一些存储器它:

char input[MAXLEN]; 
for (i = 0; i < n; i++) { 
    scanf("104%s", input); 
} 

不要忘记通过空终止所需的空间,这就是为什么我用104(MAXLEN - 1),这是一种预防措施以便不会占用比input更多的存储空间。

此外,你可以利用什么scanf()回报,做这一点:

for (i = 0; i < n; i++) { 
    if(scanf("%104s", input) != 1) 
     break; // didn't read a one string, break the loop! 
    // I got the input, let's insert it to the tree.. 
} 
+1

明白了,是的,这是有道理的。有点生疏,所以我正在为此工作。谢谢! – Adjit

+1

'“104%s”' - >'“%104s”' – chqrlie