学 C 语言的朋友,是不是一碰到字符串处理的题就头大?定义字符串时总搞不清数组长度该设多少,用 strcpy 这些函数时动不动就出错,更别说自己写代码统计字符个数了。其实啊,字符串处理的题看着复杂,常考的就那么几种,把这些题型练熟了,再看到类似的题就不会慌了。今天兔子哥就跟大家聊聊 c 语言程序设计习题中字符串处理的常见题型,都是平时练习和考试里经常出现的,一起往下看吧!
字符串的输入输出:为啥总出问题?该怎么正确写?
字符串的输入输出是最基础的题型,可新手特别容易在这里栽跟头。
输入字符串时要注意啥?
用 scanf 输入字符串的时候,格式符是 % s,比如 “char name [20]; scanf ("% s", name);”。这里要注意两点:一是数组长度要留够,比如想存 “张三” 这样的名字,至少得设 3(两个字符加一个结束符 '\0');二是 scanf 遇到空格就会停,要是输入 “张三 李四”,只能读到 “张三”。
那想输入带空格的字符串该怎么办呢?这时候得用 gets 函数,比如 “gets (name);”,它能接收一整行,包括空格。不过用 gets 有风险,要是输入的字符超过数组长度,会导致溢出。现在很多教材推荐用 fgets,比如 “fgets (name, 20, stdin);”,第二个参数就是最大长度,能更安全些。
输出字符串有啥要注意的?
用 printf 输出很简单,“printf ("% s", name);” 就行。但有时候会遇到输出乱码的情况,多半是因为字符串没加结束符 '\0'。比如自己给数组赋值时,“char str [3] = {'a','b','c'};”,这样的字符串没有结束符,printf 会一直往后找,直到碰到 '\0',结果就会乱码。所以手动赋值时,一定要记得加 '\0',或者让数组长度比字符数多 1,系统会自动补。
求字符串长度:自己写代码还是用库函数?
求字符串长度是常考题型,有两种做法:用 strlen 函数,或者自己写循环计算。
用 strlen 函数要注意啥?
strlen 在 string.h 头文件里,用之前得加 “#include
自己写代码怎么实现?
思路就是用一个循环,从第一个字符开始数,直到碰到 '\0' 为止。比如:
c运行
int my_strlen(char *str) {int len = 0;while (str[len] != '\0') {len++;}return len;}写的时候容易犯的错是循环条件写成 “str [len] == '\0'”,这样刚进去就结束了,返回 0,肯定不对。得多检查几遍循环条件。
字符串复制和连接:直接赋值为啥不行?
字符串不能直接用 “=” 赋值,比如 “str2 = str1;” 是错的,必须用函数或者循环,这也是常考的点。
字符串复制怎么弄?
用 strcpy 函数,格式是 “strcpy (str2, str1);”,把 str1 复制到 str2。但要保证 str2 的长度足够,不然会溢出。自己写的话,就用循环逐个复制字符,包括 '\0':
c运行
void my_strcpy(char *dest, char *src) {int i = 0;while (src[i] != '\0') {dest[i] = src[i];i++;}dest[i] = '\0'; // 别忘加结束符}很多人自己写的时候会漏掉最后加 '\0',导致复制过去的字符串不完整,这是一定要注意的。
字符串连接呢?
就是把一个字符串接到另一个后面,用 strcat 函数,“strcat (str1, str2);” 会把 str2 接到 str1 后面。自己实现的话,先找到 str1 的结尾('\0' 的位置),再从那开始复制 str2 的字符。比如:
c运行
void my_strcat(char *dest, char *src) {int i = 0, j = 0;while (dest[i] != '\0') { // 找到dest的结尾i++;}while (src[j] != '\0') { // 复制src的内容dest[i] = src[j];i++;j++;}dest[i] = '\0';}不过话说回来,无论是复制还是连接,都得保证目标字符串有足够的空间,不然程序可能会崩溃,这一点比写对代码还重要。
字符串比较和查找:怎么判断两个字符串相等?
比较两个字符串是否相等,不能用 “==”,得用 strcmp 函数,这也是新手常犯的错。
strcmp 函数怎么用?
“strcmp (str1, str2)” 会返回一个整数:如果 str1 和 str2 相等,返回 0;str1 大于 str2,返回正数;否则返回负数。比如判断两个字符串是否相等,应该写 “if (strcmp (str1, str2) == 0)”,而不是 “if (str1 == str2)”。
怎么查找字符串里的特定字符?
比如查找一个字符串中是否有 'a',有的话返回位置,没有返回 - 1。可以用循环逐个判断:
c运行
int find_char(char *str, char c) {int i = 0;while (str[i] != '\0') {if (str[i] == c) {return i;}i++;}return -1;}这种题不难,但要注意返回的是下标,从 0 开始算,还有没找到时要返回 - 1,别返回 0,不然会和第一个字符混淆。
对于更复杂的字符串查找,比如查找子字符串在主字符串中的位置,虽然有 strstr 函数可以用,但具体的实现原理,尤其是效率更高的算法,我目前还没完全搞明白,得后面专门花时间研究研究。
最后说点我的看法。字符串处理的题,关键在于理解字符串是以 '\0' 结尾的字符数组,很多错误都是因为忽略了这个结束符。练的时候别只依赖库函数,偶尔自己写一写实现代码,能帮你更深入地理解。刚开始可能觉得绕,但练上十几道题后,你会发现套路都差不多,慢慢就熟练了。希望这些能帮到你,有啥不会的题,随时找我聊。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~