C基础第31课--字符串典型问题分析

学习自狄泰软件学院唐佐林老师C语言课程,文章中图片取自老师的PPT,仅用于个人笔记。


实验1 : snprintf注意
实验2 :字符串使用注意
实验3 :字符串比较
实验4 : 字符串循环右移


在这里插入图片描述

在这里插入图片描述

实验1 : snprintf注意

#include <stdio.h>

int main()
{
    char buf[10] = {0};
    char src[] = "hello %s";//包含了格式化信息 %s
    
    snprintf(buf, sizeof(buf), src);
    
    printf("buf = %s\n", buf);
    
    return 0;
}

mhr@ubuntu:~/work/C$ ./a.out 
buf = hello (nu
mhr@ubuntu:~/work/C$ 

#include <stdio.h>

int main()
{
    char buf[10] = {0};
    char src[] = "hello";//包含了格式化信息 %s
    
    snprintf(buf, sizeof(buf), src);
    
    printf("buf = %s\n", buf);
    
    return 0;
}

mhr@ubuntu:~/work/C$ ./a.out 
buf = hello
mhr@ubuntu:~/work/C$ 

改:

#include <stdio.h>

int main()
{
    char buf[10] = {0};
    char src[] = "hello %s";
    
    snprintf(buf, sizeof(buf), src,“word!”);
    
    printf("buf = %s\n", buf);
    
    return 0;
}

mhr@ubuntu:~/work/C$ 
mhr@ubuntu:~/work/C$ gcc 31-1.c
mhr@ubuntu:~/work/C$ 
mhr@ubuntu:~/work/C$ 
mhr@ubuntu:~/work/C$ ./a.out 
buf = hello ZQ
mhr@ubuntu:~/work/C$ 

在这里插入图片描述

实验2 :字符串使用注意

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

int main()
{
    #define STR "Hello, \0D.T.Software\0"
    
    char* src = STR;
    char buf[255] = {0};
    
    snprintf(buf, sizeof(buf), src);
    
    printf("strlen(STR) = %d\n", strlen(STR));
    printf("sizeof(STR) = %d\n", sizeof(STR));//字符的个数 + 编译器自加的 \0
    
    printf("strlen(src) = %d\n", strlen(src));
    printf("sizeof(src) = %d\n", sizeof(src));
    
    printf("strlen(buf) = %d\n", strlen(buf));
    printf("sizeof(buf) = %d\n", sizeof(buf));
    
    printf("src = %s\n", src);
    printf("buf = %s\n", buf);
    
    return 0;
}

在这里插入图片描述

在这里插入图片描述

字符串是一个特殊的字符数组,字符指针可以指向一个字符数组,所以字符指针可以指向一个字符串

实验3 :字符串比较

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

int main()
{
    #define S1 "D.T.Software" //字符串字面量  特殊的字符数组
    #define S2 "D.T.Software" //字符串字面量  特殊的字符数组
    
    if( S1 == S2 )//  if( "D.T.Software"== "D.T.Software" ) 比较字符数组的地址
    {
        printf("Equal\n");
    }
    else
    {
        printf("Non Equal\n");
    }
    
    if( strcmp(S1, S2) == 0 )
    {
        printf("Equal\n");
    }
    else
    {
        printf("Non Equal\n");
    }
    
    return 0;
}

mhr@ubuntu:~/work/C$ gcc 31-3.c
mhr@ubuntu:~/work/C$ 
mhr@ubuntu:~/work/C$ ./a.out 
Equal
Equal
mhr@ubuntu:~/work/C$ 

很不可思议,这这两个字符串字面量(字符数组)虽然内容一样,但是他们应该是存储在不同的地址,地址应该是不一样的,这里实验怎么会相同呢?? 原因是gcc编译器做的优化,正常应该是不同的。编译器认为 “D.T.Software” 这个字符串字面量已经被定义了 存储全局只读存储区,再次的定义只会浪费空间,所以编译器将S1 S2 这两个宏都指向了 同一个 字符串字面量。

    #define S1 "D.T.Software" //字符串字面量  特殊的字符数组
    #define S2 "D.T.Software" //字符串字面量  特殊的字符数组

在这里插入图片描述

实验4 : 字符串循环右移

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

void right_shift_r(const char* src, char* result, unsigned int n)
{
    const unsigned int LEN = strlen(src);
    int i = 0;
        
    for(i=0; i < LEN; i++)
    {
        result[(n + i) % LEN] = src[i];
    }
    
    result[LEN] = '\0';
}

int main()
{
    char result[255] = {0};
    
    right_shift_r("abcde", result, 2);
    
    printf("%s\n", result);
    
    right_shift_r("abcde", result, 5);
    
    printf("%s\n", result);
    
    right_shift_r("abcde", result, 8);
    
    printf("%s\n", result);
    
    return 0;
}
发布了192 篇原创文章 · 获赞 100 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/104060966