C语言字符串与字符数组面试题中最易错考点详解
考点分析
对于C语言的字符串与字符数组,面试官经常会考察以下知识点:
- 字符串与字符数组的区别和联系;
- 字符串的初始化方式;
- 字符串的常见操作,如拷贝、追加等;
- 字符串的长度计算方法;
- 字符数组的内存分配和初始化。
对于每个知识点,我们都需要熟悉其概念、实现方法和常用的注意事项。
字符串与字符数组的区别和联系
字符串是一个以'\0'
结尾的字符数组,是C语言中表示文本的标准方式。而字符数组不一定以'\0'
结尾,可以存储任意字符序列。
字符串和字符数组在操作和使用时有很多共同点,例如它们都可以使用下标访问单个字符,都可以进行拷贝、比较、追加等操作。但是字符串有一个特殊的标志符'\0'
,使得它适合用于表示文本信息。
需要注意的是,在C语言中,可以通过修改字符数组的方式来改变字符串的内容,但是在修改时必须保证'\0'
在正确的位置。
字符串的初始化方式
C语言中有多种方式来初始化字符串,常见的包括:
- 使用字符数组初始化:
char str[] = {'h', 'e', 'l', 'l', 'o', '\0'};
- 使用字符串常量初始化:
char str[] = "hello";
- 声明时直接初始化:
char *str = "hello";
需要注意的是,第一种方式需要自己手动添加'\0'
来表示字符串的结束,否则可能会导致一些奇怪的问题。
字符串的常见操作
字符串在日常编程中使用非常频繁,其中常见的操作如下:
字符串拷贝
可以使用strcpy()
函数将一个字符串拷贝到另一个字符串中。例如:
char str1[20] = "hello";
char str2[20];
strcpy(str2, str1);
字符串连接
可以使用strcat()
函数将两个字符串连接起来。例如:
char str1[20] = "hello";
char str2[20] = "world";
strcat(str1, str2);
字符串比较
可以使用strcmp()
函数比较两个字符串大小。例如:
char str1[20] = "hello";
char str2[20] = "world";
if (strcmp(str1, str2) > 0) {
printf("str1 > str2");
} else if (strcmp(str1, str2) < 0) {
printf("str1 < str2");
} else {
printf("str1 == str2");
}
需要注意的是,当两个字符串相等时,strcmp()
函数返回0。
字符串的长度计算方法
C语言中没有直接获取字符串长度的函数,但是可以通过循环遍历字符数组的方式来计算字符串的长度。例如:
int strlen(char *str) {
int len = 0;
while (str[len] != '\0') {
len++;
}
return len;
}
该函数会循环遍历字符数组,直到遇到'\0'
结束,并返回字符串的长度。
需要注意的是,使用该函数时必须保证字符串以'\0'
结尾,否则可能会导致一些奇怪的问题。
字符数组的内存分配和初始化
字符数组在定义时必须指定数组的大小,可以事先指定大小,也可以通过动态内存分配的方式来指定大小。
例如,静态字符数组的定义和初始化方式如下:
char str[20] = "hello";
而动态分配字符数组的方式如下:
char *str = (char*) malloc(20*sizeof(char));
if (str != NULL) {
strcpy(str, "hello");
free(str);
}
需要注意的是,动态分配内存后必须手动释放,否则可能会导致内存泄漏。
示例
下面是一个常见的面试题,需要我们在字符串中找到某个字符第一次出现的位置,如果找不到则返回-1。其实现方式如下:
int indexOfChar(char *str, char ch) {
int index = -1;
int len = strlen(str);
for (int i = 0; i < len; i++) {
if (str[i] == ch) {
index = i;
break;
}
}
return index;
}
该函数会遍历字符数组,找到第一个与给定字符一样的字符时,返回该位置。
例如,indexOfChar("hello world", 'o')
会返回4,而indexOfChar("hello world", 'z')
会返回-1。
另一个示例是将一个字符串中的所有小写字母转换为大写字母,该函数如下:
void toUpper(char *str) {
int len = strlen(str);
for (int i = 0; i < len; i++) {
if (str[i] >= 'a' && str[i] <= 'z') {
str[i] = str[i] - 'a' + 'A';
}
}
}
该函数会遍历字符数组,找到每个小写字母并转换为对应的大写字母。
例如,toUpper("hello world")
会将字符串变为"HELLO WORLD"。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言字符串与字符数组面试题中最易错考点详解 - Python技术站