C语言需要掌握的基础知识点之字符串
C语言需要掌握的基础知识点之字符串
C语言中的字符串实际上是以空字符(‘\0’)结尾的字符数组。在C语言中,没有内置的字符串类型,而是使用字符数组来表示字符串。
字符串的表示
用字符数组表示字符串:
char str[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
或者更常见的,用字符串字面量初始化:
char str[] = "Hello";
用字符指针表示字符串:
char *str = "Hello";
这种方式中,字符串"Hello"存储在只读内存区,不能通过指针修改其内容(尝试修改会导致未定义行为)。因此,通常建议使用const修饰:
const char *str = "Hello";
字符串的输入输出
使用printf和puts输出字符串:
printf("%s", str);
puts(str); // 会自动换行
使用scanf和gets输入字符串:
char str[100];
scanf("%s", str); // 遇到空格会停止
gets(str); // 读取一整行,但不安全,可能造成缓冲区溢出
推荐使用fgets:
fgets(str, sizeof(str), stdin); // 安全,会指定读取的最大长度
字符串常用函数
C标准库提供了一系列字符串处理函数,位于<string.h>头文件中。
求字符串长度:strlen
size_t len = strlen(str);
字符串复制:strcpy, strncpy
char src[] = "Hello";
char dest[10];
strcpy(dest, src); // 不安全,可能溢出
strncpy(dest, src, sizeof(dest)-1); // 更安全,指定最大复制长度
dest[sizeof(dest)-1] = '\0'; // 确保字符串结束
字符串连接:strcat, strncat
char str1[20] = "Hello";
char str2[] = " World";
strcat(str1, str2); // 将str2连接到str1后面
// 使用strncat更安全,可以指定最大添加长度
字符串比较:strcmp, strncmp
if (strcmp(str1, str2) == 0) {// 字符串相等
}
字符串查找:
查找字符:strchr, strrchr(分别查找第一个和最后一个出现的位置)
查找子串:strstr
字符串与数值的转换
字符串转整数:atoi, atol, atof(注意:这些函数不检查错误,更安全的用法是strtol, strtod)
int num = atoi("123");
数值转字符串:sprintf(不安全),snprintf(安全)
char buffer[20];
int num = 123;
snprintf(buffer, sizeof(buffer), "%d", num);
示例
#include <stdio.h>
#include <string.h>int main() {char str1[20] = "Hello";char str2[] = " World";char str3[20];// 字符串连接strcat(str1, str2);printf("连接后的字符串: %s\n", str1);// 字符串复制strcpy(str3, str1);printf("复制后的字符串: %s\n", str3);// 字符串比较if (strcmp(str1, str3) == 0) {printf("两个字符串相等\n");}// 字符串长度printf("字符串长度: %lu\n", strlen(str1));// 查找字符char *p = strchr(str1, 'W');if (p) {printf("找到字符 'W',位置:%ld\n", p - str1);}return 0;
}

字符串的表示方式
字符数组表示字符串
#include <stdio.h>int main() {// 方式1:显式指定大小并初始化char str1[6] = {'H', 'e', 'l', 'l', 'o', '\0'};// 方式2:自动计算大小char str2[] = "Hello";// 方式3:使用字符串字面量char str3[20] = "Hello, World!";printf("str1: %s\n", str1);printf("str2: %s\n", str2);printf("str3: %s\n", str3);return 0;
}
字符指针表示字符串
#include <stdio.h>int main()
{char *str = "hello world!";printf("字符串:%s\n",str);printf("首字符:%c\n", *str);printf("第二个字符:%c\n",*(str+1));printf("Hello World!\n");return 0;
}
字符串的输入输出
基本的输入输出函数
#include <stdio.h>int main() {char name[50];// 使用printf输出字符串printf("请输入你的名字: ");// 使用scanf输入字符串scanf("%s", name);printf("你好, %s!\n", name);return 0;
}
更安全的输入方法
#include <stdio.h>int main() {char sentence[100];printf("请输入一句话: ");// 使用fgets读取一行(包括空格)fgets(sentence, sizeof(sentence), stdin);printf("你输入的是: %s", sentence);return 0;
}
字符串处理函数
C标准库提供了丰富的字符串处理函数,需要包含 <string.h> 头文件。
常用字符串函数示例
#include <stdio.h>
#include <string.h>int main() {char str1[20] = "Hello";char str2[20] = "World";char str3[20];char str4[50];// 字符串长度printf("str1的长度: %lu\n", strlen(str1));// 字符串复制strcpy(str3, str1);printf("复制后的str3: %s\n", str3);// 字符串连接strcpy(str4, str1);strcat(str4, " ");strcat(str4, str2);printf("连接后的str4: %s\n", str4);// 字符串比较if (strcmp(str1, str2) == 0) {printf("str1和str2相等\n");} else {printf("str1和str2不相等\n");}// 查找字符char *result = strchr(str1, 'e');if (result != NULL) {printf("在str1中找到字符'e', 位置: %ld\n", result - str1);}return 0;
}
重要的字符串函数详解
strlen - 字符串长度
#include <stdio.h>
#include <string.h>int main() {char str[] = "Programming";int length = strlen(str);printf("字符串 '%s' 的长度是: %d\n", str, length);return 0;
}
strcpy 和 strncpy - 字符串复制
#include <stdio.h>
#include <string.h>int main() {char source[] = "Hello World";char dest1[20];char dest2[20];// strcpy - 完全复制strcpy(dest1, source);printf("dest1: %s\n", dest1);// strncpy - 指定长度复制strncpy(dest2, source, 5);dest2[5] = '\0'; // 手动添加结束符printf("dest2: %s\n", dest2);return 0;
}
strcat 和 strncat - 字符串连接
#include <stdio.h>
#include <string.h>int main() {char str1[50] = "Hello";char str2[] = " World";char str3[] = " Programming";// strcat - 完全连接strcat(str1, str2);printf("连接后: %s\n", str1);// strncat - 指定长度连接strncat(str1, str3, 5);printf("部分连接后: %s\n", str1);return 0;
}
strcmp - 字符串比较
#include <stdio.h>
#include <string.h>int main() {char str1[] = "apple";char str2[] = "banana";char str3[] = "apple";int result1 = strcmp(str1, str2);int result2 = strcmp(str1, str3);int result3 = strcmp(str2, str1);printf("比较 '%s' 和 '%s': %d\n", str1, str2, result1);printf("比较 '%s' 和 '%s': %d\n", str1, str3, result2);printf("比较 '%s' 和 '%s': %d\n", str2, str1, result3);return 0;
}
字符串与数值的转换
常用转换函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main() {// 字符串转数值char intStr[] = "123";char floatStr[] = "45.67";int intValue = atoi(intStr);double doubleValue = atof(floatStr);printf("字符串 '%s' 转换为整数: %d\n", intStr, intValue);printf("字符串 '%s' 转换为浮点数: %.2f\n", floatStr, doubleValue);// 数值转字符串char buffer[20];int num = 987;sprintf(buffer, "%d", num);printf("整数 %d 转换为字符串: '%s'\n", num, buffer);return 0;
}
字符串数组
字符串数组的表示
#include <stdio.h>
#include <string.h>int main() {// 字符串数组 - 二维字符数组char languages[][20] = {"C", "C++", "Java", "Python", "JavaScript"};int count = sizeof(languages) / sizeof(languages[0]);printf("编程语言列表:\n");for (int i = 0; i < count; i++) {printf("%d. %s\n", i + 1, languages[i]);}return 0;
}
字符指针数组表示字符串数组
#include <stdio.h>int main() {// 字符指针数组char *fruits[] = {"Apple", "Banana", "Orange", "Grape", "Mango"};int count = sizeof(fruits) / sizeof(fruits[0]);printf("水果列表:\n");for (int i = 0; i < count; i++) {printf("%d. %s\n", i + 1, fruits[i]);}return 0;
}
字符串操作的实际应用
字符串反转
#include <stdio.h>
#include <string.h>void reverseString(char str[]) {int length = strlen(str);int start = 0;int end = length - 1;while (start < end) {// 交换字符char temp = str[start];str[start] = str[end];str[end] = temp;start++;end--;}
}int main() {char text[] = "Hello World";printf("原字符串: %s\n", text);reverseString(text);printf("反转后: %s\n", text);return 0;
}
统计字符串中的单词数
#include <stdio.h>
#include <ctype.h>int countWords(char str[]) {int count = 0;int inWord = 0; // 标记是否在单词中for (int i = 0; str[i] != '\0'; i++) {if (isspace(str[i])) {inWord = 0;} else if (inWord == 0) {inWord = 1;count++;}}return count;
}int main() {char sentence[] = "C programming is fun and challenging";printf("句子: \"%s\"\n", sentence);printf("单词数: %d\n", countWords(sentence));return 0;
}

示例:计算最后一个单词长度
描述
对于给定的若干个单词组成的句子,每个单词均由大小写字母混合构成,单词间使用单个空格分隔。输出最后一个单词的长度。
输入描述:
在一行上输入若干个字符串,每个字符串代表一个单词,组成给定的句子。
除此之外,保证每个单词非空,由大小写字母混合构成,且总字符长度不超过 10^3 。
输出描述:
在一行上输出一个整数,代表最后一个单词的长度。
#include <stdio.h>
#include<string.h>int main() {char sentence[1001];// 读取整行输入fgets(sentence, sizeof(sentence), stdin);int len = strlen(sentence);int lastWordLength = 0;//从字符串末尾开始向前遍历for(int i = len - 1;i >=0;i--){//跳过末尾和空格if(sentence[i] == '\n' || sentence[i] == ' '){continue;}//开始计算最后一个单词的长度//遇到空格或者到达字符开头时停止if(i == 0 || sentence[i -1] == ' '){// 从当前位置开始向后统计直到遇到空格或字符串结束for (int j = i; j < len; j++) {if (sentence[j] == ' ' || sentence[j] == '\n' || sentence[j] == '\0') {break;}lastWordLength++;}break;}}// 输出最后一个单词的长度printf("%d\n", lastWordLength);return 0;
}

另一种更简洁的实现方式:
#include <stdio.h>
#include <string.h>
#include <ctype.h>int main() {char sentence[1001];fgets(sentence, sizeof(sentence), stdin);int len = strlen(sentence);int count = 0;// 去除末尾的换行符if (len > 0 && sentence[len-1] == '\n') {sentence[len-1] = '\0';len--;}// 从后往前遍历,统计最后一个单词的长度for (int i = len - 1; i >= 0; i--) {if (sentence[i] != ' ') {count++;} else {break;}}printf("%d\n", count);return 0;
}

