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);