使用来自char的良好数据时出现分段错误

时间:2013-12-28 22:53:43

标签: c string if-statement char segmentation-fault

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    char str1[30];
    char str2[30];
    const char jpg[15] = "jpg"; // 1
    const char png[15] = "png"; // 2
    char *answer1;
    char *answer2;

    strcpy(str1, argv[argc - 1]);
    strcpy(str2, str1);
    answer1 = strstr(str1, jpg);
    answer2 = strstr(str2, png);
    printf("answer - %s ,  answer2 %s str1, %s str2 %s\n", answer1, answer2, str1, str2);

    // (strcmp(argv[i], "-dia") == 0)

    // if (strcmp(answer1,"jpg") == 0)
    //     printf("%s\n", answer1);

    // if (strcmp(answer2, "png") == 0 )
    //     printf("%s\n", answer2);

    if (strcmp(answer1, "jpg") == 0 || strcmp(answer2, "png") == 0)
    {
        printf("if I have a %s -> jpg || ( or an) png _> %s then print this else abort\n", answer1, answer2);
    }
    else
    {
        printf("ABORT\n");
    }

    return 0;
}

我的输出:

/testfiles$ ./a.out oute.png
answer - (null) ,  answer2 png str1, oute.png str2 oute.png
Segmentation fault

为什么我会得到一个 - &gt; 分段错误&lt; - 使用一个和一个条件为真

/testfiles$ ./a.out oute
answer - (null) ,  answer2 (null) str1, oute str2 oute
Segmentation fault

我得到了一个 - &gt; 分段错误&lt; - 使用那个并且两个条件都是假的

/testfiles$ ./a.out oute.jpg
answer - jpg ,  answer2 (null) str1, oute.jpg str2 oute.jpg
|| yep jpg or yep (null), 

一个条件是真的,我没有 - &gt; 细分错误&lt; -

返回假设为NULL,这让我感到困惑。如果我从两个条件中得到一个然后运行程序,否则中止它。换句话说, 的两个条件只能 ,否则为false。如果一个或另一个为真,则运行该程序,否则中止它。如果两者都是假的,则中止该程序。

  1. 如果第一个是假的,请检查第二个是否为真==好 - &gt;运行程序。
  2. 如果第一个是真的,请检查第二个是假的==好 - &gt;运行程序。
  3. 如果第一个是假的而第二个是假的==坏 - &gt;中止该计划。
  4. ((另一个问题是我甚至不确定如何用C语言写))

    因为如果我这样写它,在main中保留其他所有内容,只需注释掉其他代码然后再次运行它。如果第一个等于真,那就是找到“ jpg ”然后它不检查第二个,它应该反而中止,不管第二个条件是真是假。离开我,如果没有中止,我如何检查这两个条件是否成立?以这种方式。

    如果一个为真,那么如果两者都为假,则运行else abort。

        if (strcmp(answer1,"jpg") != 0 && strcmp(answer2, "png") != 0 )
        {
            printf("abort\n");
            abort();
        }
    
        printf("still running\n");
    

    我明白了,

    /testfiles$ ./a.out oute.jpg
    answer - jpg ,  answer2 (null) str1, oute.jpg str2 oute.jpg
    still running
    

    jpg ”就在那里,但当我用“ png ”这样做时,我得到了这个。

    /testfiles$ ./a.out oute.png
    answer - (null) ,  answer2 png str1, oute.png str2 oute.png
    Segmentation fault
    

    无论哪种方式我写它我反而得到这个 - &gt; 细分错误&lt; - 为什么? 如果这个问题让你感到困惑,那么那就是我们两个人,因为这对我为什么会遇到分段错误毫无意义。

    增加:

    离开互联网 http://www.tutorialspoint.com/ansi_c/c_strcmp.htm 实施例

    #include <stdio.h>
    
    int main() {
    char string1[20];
    char string2[20];
    
    strcpy(string1, "Hello");
    strcpy(string2, "Hellooo");
    printf("Return Value is : %d\n", strcmp( string1, string2));
    
    strcpy(string1, "Helloooo");
     strcpy(string2, "Hellooo");
    printf("Return Value is : %d\n", strcmp( string1, string2));
    
    strcpy(string1, "Hellooo");
    strcpy(string2, "Hellooo");
    printf("Return Value is : %d\n", strcmp( string1, string2));
    
    return 0;
      }
    

    它会产生以下结果:

    返回值为:-111    返回值是:111    返回值为:0

    使用char * var然后使用strcpy处理它,然后使用该指针并检查以查看 如果它匹配。如果两者不匹配任何其他东西,那么零0将返回。

    char和int混合在一起,如果他们将一个NULL或'\ 0'放入char中以进行无值返回, 然后为什么在GOD或MAN的名字中他们没有写一个函数来询问char *是否有 一个NULL或'\ 0'然后返回一个零0所以所有人必须做的是调用该函数 if statment if(checkcharfornull(var))如果为NULL则给出零,如果没有则给出任何esle,就像 strcmp何时或如果它不是NULL ?????

2 个答案:

答案 0 :(得分:3)

因为您没有检查“answer1”和“answer2”的值,它们可能为NULL。当它们为null时,您将尝试通过这些变量引用数据指针:

  if (strcmp(answer1,"jpg") != 0 && strcmp(answer2, "png") != 0 )

这会导致段错误。

答案 1 :(得分:1)

有趣的是,我之前放在那里的答案被MOD删除了,说明了这个 - &gt; if(number1&amp;&amp; * number1){...}&lt; ---“这不能提供问题的答案。要批评或要求作者澄清,请在帖子下面留言 - 你可以随时评论你自己的帖子,一旦你有足够的声誉,你就可以评论任何帖子。 - 尖叫12小时前 - “

我认为他这个MOD然后应该知道更多的C然后在这里做任何评估,当他实际上他错了,他是一个MOD ???删除正确答案的原因除了他自己不知道他在看什么因此它不可能是正确的?

if (number1 && *number1) { ... }

(number1&amp;&amp; * number1)是函数调用,而{....}是跟在它之后的代码..如果我,某人甚至不知道我正在做的事情的一半知道那那么为什么MOD​​也不知道他是MOD ......

只是因为看起来他不知道C并且不理解它,我刚刚学到了什么,然后他做了一个判断调用,说它不是答案,因为他不理解代码,当它实际上是答案。

所以,我将ANSWER发布到我自己的问题上,他说这不是答案。我为什么要骗自己?从来没有做过任何事情。

像这样的家伙说:

因为您没有检查“answer1”和“answer2”的值,它们可能为NULL。当它们为null时,您将尝试通过这些变量引用数据指针:

 if (strcmp(answer1,"jpg") != 0 && strcmp(answer2, "png") != 0 )

这导致了段错误。

然后,就像他再次说:“如果指针为空并且这是一个有效的条件,那么,那么你需要一个if语句,以便在null时不使用指针。< / strong> - OldProgrammer 15小时前“

如果您要查找的内容不存在,那么strstr会返回NULL,使其成为有效条件,现在将两个和两个放在一起并执行“ OldProgrammer ”所说的我需要做的事情我明白了:

if (number1 && *number1) { ... }

给你这个:

同样回答:

  if (number1 && *number1) { ... }

扩展到这个----

if (answer1 && *answer1  || answer2 && *answer2)
        {
                ;
        }
        else
        {
        abort();
        }

它检查VAR是否为字符串Char,用*取消引用指针,得到0为NULL 你无法检查它是否为NOT NULL - 每次都将它炸毁。