C中判定字符串为空的一系列问题

直接上测试代码:

#include <stdio.h>
#include <string.h>
int main(){
    char str[100]="Hello";
    printf("%s\n", &str[strlen(str)-2]);
    printf("%d\n", strcmp(&str[strlen(str)], ""));
    if (&str[strlen(str)] == "\0")
        printf("1\n");
    if (str[strlen(str)] == '\0')
        printf("2\n");
    if (strlen(&str[strlen(str)]) == 0)
        printf("3\n");
    if (str[strlen(str)] == NULL)
        printf("4\n");
    if (str[strlen(str)] == 0)
        printf("5\n");

    char *s1 = NULL;
    char s2[10] = "\0";
    char s3 = '\0';
    if (s1)
        printf("6\n");
    if (s2)
        printf("7\n");
    if (s3)
        printf("8\n");
}

输出结果是:

/home/zhoutall/ccode/testch.cpp: 在函数‘int main()’中:
/home/zhoutall/ccode/testch.cpp:14:26: 警告: 算术表达式中使用了 NULL [-Wpointer-arith]
lo
0
2
3
4
5
7


以下个人分析:

printf("%s\n", &str[strlen(str)-2]);

这一句我是试着做个定位,输出str后两位,调试后应该是需要一次&运算,把地址传过去。否则的话其实str[strlen(str)-2]的类型是char,就是一个字符。传char *类型才会被当作字符串,输出时会一直找到’\0’。

printf("%d\n", strcmp(&str[strlen(str)], ""));

最常见字符串比较方法strcmp,它的参数是两个char*,所以也需要&运算。

if (&str[strlen(str)] == "\0")
if (str[strlen(str)] == '\0')

第一个未通过,第二个通过。显然第二个是因为str[strlen(str)]就是最后一个char,相当与比较两个char而不是string。
第一个不对显然是等号比地址,两个地址肯定不一样。
当然strcmp(&str[strlen(str)], “\0”)是可以的。

strlen(&str[strlen(str)]) == 0

“\0″长度为0,这个通过了。

if (str[strlen(str)] == NULL)
if (str[strlen(str)] == 0)

两个都通过了,其实NULL就是0,不过编译器报了个警告。

char *s1 = NULL;
char s2[10] = "\0";
char s3 = '\0';
if (s1)
    printf("6\n");
if (s2)
    printf("7\n");
if (s3)
    printf("8\n");

只输出了7。好乱。。。。
补充了一些测试:

printf("---%d\n", strcmp(s2, ""));
printf("---%d\n", strcmp("\0", ""));
printf("---%d\n", strcmp("\0ss", ""));

输出3个0。第三个很有意思,其实说白了就是一直都是以’\0’字符为字符串结束界限的。

得出结论,字符串比较很乱很乱,还是用strcmp最保险。如果是判断空字符串的话,上面有多一个方法就是调用strlen,结果等于0。
弄得挺糊涂,本文欢迎留言交流~

Tags :

0 thoughts on “C中判定字符串为空的一系列问题”

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Click the right image To submit your comment: