C语言中如何正确使用char类型、字符串和if-else判断语句?
代码问题排查
- 字符串存储方式错误:你定义的
char* a是未初始化的字符指针,没有指向合法的可写内存空间,直接用scanf写入会触发未定义行为,严重时会直接崩溃。且scanf("%s", &a)的传参错误,&a取的是指针变量本身的地址,不是用来存储字符串的内存地址。
- 字符串存储方式错误:你定义的
- if条件判断逻辑错误:
if (a = "yes")这里用的是赋值运算符=,不是相等判断运算符==,此处相当于把字符串常量"yes"的地址赋值给a,赋值表达式的结果非0,因此第一个if永远为真,这就是无论输入什么都输出第一个分支内容的核心原因。
- if条件判断逻辑错误:
- 字符串比较方式错误:就算把
=改成==也无法实现功能,C语言中直接对指针用==比较的是两个指针指向的内存地址,不是字符串的内容,用户输入的字符串存在栈/堆内存,和常量区的"yes""no"地址必然不同,永远不会匹配成功。C语言比较字符串内容需要用标准库的strcmp函数。
- 字符串比较方式错误:就算把
修正后可运行代码
#include <stdio.h> // 使用strcmp需要引入string.h头文件 #include <string.h> int main() { // 定义字符数组存储用户输入,长度设为10足够存储yes/no和字符串结束符'\0' char a[10]; printf("Enter a string: "); // 数组名本身就是首元素地址,直接传a即可,限制输入长度避免内存溢出 scanf("%9s", a); // strcmp在两个字符串内容相等时返回0,因此判断返回值是否为0即可 if (strcmp(a, "yes") == 0) { printf("Number is 30"); } else if (strcmp(a, "no") == 0) { printf("Number is 50"); } else{ printf("oops"); } return 0; }
char、字符串、数组与if-else的搭配说明
- char是C语言的基础字符类型,单个char变量只能存储1个ASCII字符,比如
char c = 'a',单字符判断可以直接在if条件中用==比较:if(c == 'a') - C语言的字符串本质是末尾带'\0'结束符的char类型连续内存序列,通常用char数组或者分配了内存的char指针存储:
- 存储长度确定的短字符串优先用固定长度的char数组,比如
char str[20],定义时就分配了栈内存,不需要手动管理释放,出错概率低 - 如果字符串长度不确定,再用
char *str = malloc(长度)的方式分配堆内存,使用完成后要手动free释放内存
- 存储长度确定的短字符串优先用固定长度的char数组,比如
- 字符串和if-else搭配的核心规则:
- 不能直接用
==、!=这类运算符比较两个字符串的内容,必须用<string.h>头文件提供的strcmp函数 strcmp(str1, str2)返回值规则:两个字符串内容完全相等时返回0,str1字典序比str2大返回正数,更小返回负数,因此判断相等固定写if(strcmp(str1, str2) == 0)- 处理用户输入前一定要保证存储字符串的数组/指针已经分配了足够的可写内存,避免内存溢出
- 不能直接用
内容的提问来源于stack exchange,提问作者user17463009
相关产品推荐
相关产品推荐

