char word[] = {‘H’,‘e’,‘l’,‘l’,‘o’};
这样只是字符数组,并不是字符串。
char word[] = {‘H’,‘e’,‘l’,‘l’,‘o’,‘\0’};
char *s = "Hello World"; 定义的 s 是一个指向字符串常量的指针,字符串常量存储在内存的代码段中,是只读不可修改的。因此,如果尝试通过 s 来修改字符串中的某个字符,会导致不可预测的行为。char s[] = "Hello World"; 定义的 s 是一个字符数组,存储在程序的堆栈中,是可以修改的。这里使用了字符数组的初始化方式,相当于将字符串常量 “Hello World” 中的每个字符复制到 s 中,最后添加一个空字符 ‘\0’ 作为结尾。因此,s 存储的是一个以空字符 ‘\0’ 结尾的字符串。char *s 的其他用法,char *s 定义的是一个指向字符型的指针,它可以指向字符数组的起始地址,也可以指向字符串常量的首地址,甚至可以指向任何一个 char 类型的变量或数组。在使用指针变量时,需要注意指针指向的地址是否合法,以及指针指向的内容是否可读写等问题。scanf 函数时,%7s 表示读取并存储长度为 7 的字符串,且在字符串后面添加一个空字符 ‘\0’,以确保该字符串在后续操作中是有效的。如果用户输入超过 7 个字符,则会将多余的字符留在输入缓冲区中,这些字符会在下一次读取时被读取。例如:rustCopy codechar str[8];
scanf("%7s", str);
如果用户输入 “HelloWorld”,则只有前七个字符 “HelloWo” 被存储在 str 中,而 “rld” 会留在输入缓冲区中,等待下一次读取。
char *s 来表示字符串时,必须先为 s 分配内存并将其初始化,否则它只是一个未定义的指针,无法用于存储字符串。例如:cCopy codechar *s = (char*) malloc(8 * sizeof(char)); // 为 s 分配内存
strcpy(s, "Hello"); // 将字符串 "Hello" 复制到 s 中
或者可以直接使用字符串常量初始化 s:
char *s = "Hello";
在这种情况下,s 将指向一个存储在程序代码段中的字符串常量。需要注意的是,这种方式定义的字符串是只读的,无法修改字符串的内容。如果需要修改字符串,则需要使用数组来存储字符串。例如:
char s[] = "Hello";
s[0] = 'h'; // 将第一个字符 'H' 修改为 'h'
char **a:表示 a 是一个指向指针的指针,通常用于表示二维字符数组。char a[][10]:表示 a 是一个二维字符数组,第二维的长度为 10,用于存储多个长度不超过 9 的字符串。char *a[]:表示 a 是一个指针数组,每个元素都是一个指向字符数组或字符串常量的指针,用于存储多个字符串。#include
#include
size_t mylen(const char * s){int index = 0;while(s[index] != '\0'){index++;}return index;
}
int main(int argc,char const *argv[]){char s[30] ="Hello";printf("mylen is %lu\n",mylen(s));return 0;
}
#include
#include
int mycmp(const char * s1,const char * s2){while(*s1 == *s2 && *s1 != '\0'){s1++;s2++;}return *s1 - *s2;
}
int main(int argc,char const *argv[]){char s1[] = "Abc";char s2[] = "abc";printf("%d\n",mycmp(s1,s2));return 0;
}
char *mycpy(char *dst,const char *src){char *ret = dst;while(*src){*dst++ = *src++;}return ret;
}
使用strncat和strncpy函数进行连接和拷贝会更加安全。