我很难理解这部分意味着什么:
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,为什么不只是其中之一。我能做到这一点吗?
答案 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;
}