字符串和数组(c)

c 中其实并没有字符串的概念,但是却可以借助数组(字符串数组) 以及    \ 0  来实现;

c 中 利用 “” 来引用多个字符成为一种特殊的字面量,其直接存储在全局只读区(不可以改变);

    char ca[] = {'H', 'e', 'l', 'l', 'o'};
    char sa[] = {'W', 'o', 'r', 'l', 'd', '\0'};
    char ss[] = "Hello world!";
    char* str = "Hello world!";

看看哪些是 c 中的字符串;

字符串是一个数组(这是本质) 所以它也可以看作是常量指针 且 其不可以改变值;

    char b = "abc"[0];
    char c = *("123" + 1);
    char t = *"";
    
    printf("%c\n", b);
    printf("%c\n", c);
    printf("%d\n", t);

这段代码 就展示了字符串 就是数组

    char s[] = "Hello\0world";
    int i = 0;
    
    for(i=0; i<sizeof(s)/sizeof(char); i++)
    {
        printf("%c\n", s[i]);
    }
    
    printf("%s\n", s);

    printf( "%d\n", strlen(s) );
    printf( "%d\n", strlen("123") );
 

c 中许多的字符串函数都是依据 \0来操作的 ,所以上面的结果是 一次打印hello world  一次 5 一次 3;


字符串典型问题分析(都是面试题哦!)

比较字符串 要用strcmp 不用 ==(因为==很可能 比较的是字符串的地址哦)

有移字符串数组:

#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;
}

想一想 有什么高效的实现;

 

牛客做到的一个关于c中字符串的题目

	//Mat image = imread("flower.jpg",0);

	const char str1[] = "ab"; //"ab"是字符串常量,放在字符数据区,然后给数组赋值,怎么赋值,先在内存中开辟一段空间,然后逐个字符复制过去。
							  //然后这段内存有个起始地址,那起始地址的值存在哪里?存在str1里面也就是最开始说的4字节
	const char str2[] ="ab" ;

	const char *p1 = "ab";
	const char *p2 = "ab";//系统并没有去开辟一段新空间来复制“abc”,而是将其首字母的地址赋给了前面开辟的p1的4字节空间。

	printf("%p\n", str1);
	printf("%p\n", str2);
	printf("%p\n", p1);
	printf("%p\n", p2);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值