2015-05-16 93 views
-1

我试图安排这个只包含数字的字符数组,它打印与我输入它没有任何变化的顺序相同的数组,我试着在if语句中使用类型转换,它给了我正确的运行结果,但没有被在线裁判接受。这里的错误是什么,为什么我的第二个解决方案不被接受?比较字符数组元素

#include <stdio.h> 
#include <string.h> 
int main() { 
    char x[101]; 
    scanf("%s",x); 
    int l,i,j ; 

    l = strlen(x); 

    char temp ; 

    for(i=0;x[i];i++) 
    { 
     for(j=i ; x[j] ; j++){ 

      if('x[j]'<'x[i]') //(int)x[j] and (int)x[i] didn't work on the 
           //online judge 
      { 
       temp=x[i]; 
       x[i]=x[j]; 
       x[j]=temp; 

      } 
     } 
    } 

    printf("%s",x); 
    return 0 ; 
} 
+0

这是什么''x [j]''?这是一个多字符常量,很可能没有做你想做的事情。另外,'l = strlen(x);'和你放下'l',删除它。 –

+0

我认为它会将字符更改为一个整数,表示该字符的ascii,如她所说的http://www.cs.swarthmore.edu/~newhall/unixhelp/C_chars.html,以便我可以比较它们。可以详细说明一下吗? –

+0

@OmarKhaled尽你所能,但它没有任何意义。由于这些是常量字符串,在这种情况下,它几乎等同于'if(false)'。 – szczurcio

回答

1

我不知道为什么周围有数组元素的报价,但不是做你的想法,比较正在发生的事情,因为一个多字符字符串进行评估,以一个整数值,这是实现定义的,因此, if语句总是比较相同的值,这意味着它总是会产生相同的结果,你需要删除引号

if (x[j] < x[i]) 

另外,我建议你指定数组的长度scanf()和检查它是否成功读取价值,如thi ŝ

if (scanf("%100s", x) != 1) 
    return -1; /* Perhaps EOF, i.e. you pressed Ctrl+D or (Ctrl+Z MS Windows) */ 

如果你不检查你的程序将调用未定义的行为,如果这里不伤害你的简单程序的任何重要组成部分,如果你不学会做它,那么你将在编写一个更大的程序时,将来会有很多难以调试的错误。

+0

这段代码是针对在线裁判问题的,所以虽然这样的检查是一种很好的做法,但在这种情况下,由于没有人会给出该代码无效的输入,所以这会浪费时间。 – szczurcio

+0

感谢它正常工作 –

+2

@OmarKhaled你可以通过点击复选标记接受答案,我希望你能理解我的解释,否则请随时要求澄清。 –

0

if语句中的报价计算为多字符常量,它在我的编译器(VC++ 2013年)正好是785B6A5D785B695D分别,这是这些字符粘在一起的ASCII码。因此if从不执行。另外,你的意思是“没有工作”?你有编译错误吗?如果是的话,它说了什么?否则,由于冒泡排序非常缓慢,您可能已经超出了时间限制。

+0

不,我从测试编号1得到的错误答案法官的编译器从我的代码中返回的输出与样本测试用例中的编译器不同,即使在我对您进行了更正之后 –