什么!s || !*是什么意思? (s是char *)

时间:2016-02-15 16:56:00

标签: c string

我很难理解这部分意味着什么:

 if (!s || !*s) //What is this?!?!
      {
        printf("\n");
        return;
      }

这是我的主要职能:

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

void func1(char *s);

int main()
{
    func1("SABABA");
    return 0;
}

我的func1:

void func1(char *s)
{
    int a, b, c;
    if (!s || !*s)
    {
        printf("\n");
        return;
    }
    b = strlen(s);
    while (b>2)
    {
        a = 0;
        if (s[a] == s[b - 1])
        {
            for (c = b - 1; c >= a && s[a] == s[c]; a++, c--);
            if (c<a)
            {
                int i;
                for (i = 0; i<b; i++)
                    printf("%c", s[i]);
                printf(" ");
            }
        }
        b--;
    }
    func1(s + 1);
}

我的观点:&#39; s&#39;表示字符串的地址,而!s表示我们何时在&#34;堆栈外面#34;的字符串。例如,如果起始地址是1000并且字符串是6个字符,那么我们最终在1006中。如果我们超过1006,例如,到1007那么它!s返回true。并且关于* s,它检查地址1000所拥有的值,即&#34; S&#34;这是真的,意思是!* s是假的。因为我们知道每个字符串以&#34; / 0&#34;结尾这将是,我想在1007,我们搜索。如果我是对的,那么为什么我们需要两个!s和* s,为什么不只是其中之一。我能做到这一点吗?

3 个答案:

答案 0 :(得分:8)

!s正在检查s不是空指针。

!*s正在检查指向不是s的字符'\0',这意味着s不是空字符串。

该检查与调用func1("SABABA")不匹配,但已为func1(0)func1("")准备。

答案 1 :(得分:1)

!不是(=否定)。 任何非零值都可以认为是真的,0是假的。 这样:

void *ptr = NULL;
void *ptr2 = "444";  // ptr2 will point to a real address, which is never NULL (=0)

if(ptr) {}  // This evaluates to false, because 'ptr' points to 0
if(!ptr) {} // ptr is 0 => false, but theres still a negator, so the result 

if(ptr2) {}  // true
if(!ptr2) {} // false

结果将是真的。

* ptr指的是ptr指向的值。 这样:

int x = 5;
int *ptr;
ptr = &x;  // ptr points to a memory cell, which is filled with an integer with value 5

if(*ptr) {}  // is true, because the value pointed by ptr is a non-zero value.
if(!*ptr) {} // negate previous result => false

SOOOO: if(!s ||!* s) 换句话说,这意味着:(&#39; s&#39;是指向字符串的指针,或者可能为NULL) 如果出现if-body NOT

s == NULL

OR

&#39; s&#39;指向的第一个字符(值)是0(= \ 0)

在这些情况下,测试将成立:

s = NULL;
s = "\0 This string starts with an 0 character";
s = "";   // empty string, but "" implicitly appends a '\0'

答案 2 :(得分:0)

语句if (!s || !*s)检查指针s是否为空指针,或者指针的目标是否为'\0'。前一项检查是必需的,因为您可以为此函数提供一个指针来自malloc。这是一个例子:

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

void func1(char *s);

int main()
{
    char *str = "SABABA";
    char *ptr = (char*)malloc(10 * sizeof(char));

    func1(str);

    //ptr may have null value,that's why we check in func1
    func1(ptr);

    free(ptr);
    return 0;
}