c - == 运算符跳过条件 if 语句,即使条件为真
问题描述
试图为下面编写一个程序,
所以这里的输入将是 aaabbbccc
输出将是 abc
#include<stdio.h>
int main()
{
char arr[10]={'0'};
char ch;
printf("enter input characters: ");
for(int i=0;i<10;i++){
ch=getchar();
if(arr[i]=='0')//skips here even though the array element has'0'
//in it.
arr[i]=ch;
}
for(int i=0;i<10;i++){
if(arr[i]!='0')
printf("%c",arr[i]);
}
return 0;
}
解决方案
来自 C 标准:
§ 6.7.8.21:
如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应隐式初始化与具有静态存储持续时间的对象相同。
§ 6.7.8.10:
如果具有自动存储持续时间的对象未显式初始化,则其值是不确定的。如果具有静态存储持续时间的对象未显式初始化,则:
— 如果它具有指针类型,则将其初始化为空指针;
— 如果它具有算术类型,则将其初始化为(正或无符号)零;
— 如果是聚合,则每个成员都根据这些规则(递归地)初始化;
— 如果是 isaunion,则根据这些规则(递归地)初始化第一个命名成员。
强调我的。
char
是 C 中的数字类型,因此如果您仅将第一个数组元素显式初始化为字符'0'
(顺便说一下,它没有数值0
),其余部分将具有数值0
并且比较'0'==0
将为 false .
推荐阅读
- html - 如何在 apiary 中记录 502 HTML 响应
- tensorflow - TensorFlow 对象检测 API 过拟合
- playframework - 使用 Ehcache 和/或 Caffeine 时,Play Framework 中的(默认)缓存大小限制是多少?
- java - 使用 Netbeans 平台应用程序 (FlatLaF) 设置标题栏的颜色
- javascript - 替换 if else 以切换大小写
- java - 如何使用所有代理/方面调用 spring bean 方法?
- shell - Shell 脚本:即使脚本具有内置 mount -o remount, exec,权限也被拒绝
- python - Plotly:如何设置分组的子图?
- javascript - 如何向查看页面源代码显示元标记,通过 Javascript 添加
- laravel - 调用未定义的方法 Illuminate\Database\Eloquent\Builder::mapInto()