代码疑点求讲解 for( i=0;s[i];i++ )
本帖最后由 yuhang2020 于 2021-3-16 11:40 编辑代码是求输入的字符串中 重复字符及出现的次数{:5_100:}
疑问1:for( i=0;s[ i ];i++ )这个循环什么意思呀,s[ i ]可以是条件吗?这是个ASCII值?为什么写 i>=97就报错
疑问2:carr++ ;这个没看懂是什么意思,感觉也是ASCII
#include<stdio.h>
int main()
{
char s;
int carr={0};
int i;
printf("input a string: ");
gets(s);
for( i=0;s[ i ];i++ )
{
int index=s[ i ];
if ( index >=0 && index <= 127 )
carr++ ;
}
for( i=0;i<128;i++ )
if ( carr[ i ] > 1 )
printf("%c:%d\n", i, carr[ i ] );
return 0;
} 这不就是统计有哪些字符是重复的 并重复次数是多少 原理很简单
设置了几个盒子比如0-9a-zA-Z这就是62个盒子,每个盒子都用自己的码值做索引
开始时 清零 ,然后检索字符串时遇到码值与索引值相同 则自增
最后能统计出所有字符出现的频次,凡是大于等于2的 都打印出来 wp231957 发表于 2021-3-16 11:47
原理很简单
设置了几个盒子比如0-9a-zA-Z这就是62个盒子,每个盒子都用自己的码值做索引
开始时 清零 ...
感谢感谢!虽然大概是听懂一些了,但这个 for( i=0;s[ i ] ; i++),这里s[ i ] 是一个什么条件
还有这个carr [ index ]++又是代表了什么
已解决!
以下是我的理解:
s [ i ] 是一个界限,当输入一个apple,读完e,for循环就停止,类似于读到 '\0' 就结束。
index 的定义是为了取出 s [ i ] 的字符的ASCII值, carr [ index ] ++ 是记录哪一个值的覆盖次数。
例如apple的ASCII值是 97、112、112、108、101,那么只需要验证112就可以,看看是不是覆盖次数2,
后面的carr[ i ] 就是看看刚刚取到的ASCII有没有覆盖,然后112读出2次的结果。
yuhang2020 发表于 2021-3-16 12:13
感谢感谢!虽然大概是听懂一些了,但这个 for( i=0;s[ i ] ; i++),这里s[ i ] 是一个什么条件
还有这 ...
#include<stdio.h>
int main()
{
char s={'\0'}; //这里是储存原始字符串的(待统计字符串)
int carr={0}; //可见ascii码都是小于128的,这里全部初始为0,本题中就是每个ascii码值对应的频次为0
int i;
printf("input a string: ");
gets(s);
for( i=0;s!='\0';i++ ) //s就相当于 s!='\0'这是大神们的一种炫酷写法
{
int index=s[ i ];
if ( index >=0 && index <= 127 )
carr++ ; //程序所有焦点或者核心 就这一句代码 ,这个自己细细体会
//简单举例,比如你输入E (E的ascii码值为69) 那么carr+=1 什么意思,自己琢磨一下
}
for( i=0;i<128;i++ )
if ( carr[ i ] > 1 )
printf("%c:%d\n", i, carr[ i ] );
return 0;
} wp231957 发表于 2021-3-16 13:01
非常感谢!!我已通过你的回复解决了此问题!
页:
[1]