鱼C论坛

 找回密码
 立即注册
查看: 2950|回复: 6

[已解决]代码疑点求讲解 for( i=0;s[i];i++ )

[复制链接]
发表于 2021-3-16 11:18:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 yuhang2020 于 2021-3-16 11:40 编辑

代码是求输入的字符串中 重复字符及出现的次数

疑问1:  for( i=0;s[ i ];i++ )  这个循环什么意思呀,s[ i ]可以是条件吗?这是个ASCII值?为什么写 i>=97就报错
疑问2:  carr[index]++ ;  这个没看懂是什么意思,感觉也是ASCII

#include<stdio.h>
int main()
{
    char s[1024];
    int carr[128]={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[index]++ ;
    }
    for( i=0;i<128;i++ )
        if ( carr[ i ] > 1 )
            printf("%c:%d\n", i, carr[ i ] );
        return 0;
}
最佳答案
2021-3-16 13:01:47
yuhang2020 发表于 2021-3-16 12:13
感谢感谢!虽然大概是听懂一些了,但这个 for( i=0;s[ i ] ; i++),这里s[ i ] 是一个什么条件
还有这 ...

#include<stdio.h>
int main()
{
    char s[1024]={'\0'};   //这里是储存原始字符串的(待统计字符串)
    int carr[128]={0};   //可见ascii码都是小于128的,这里全部初始为0,本题中就是每个ascii码值对应的频次为0
    int i;
    printf("input a string: ");
    gets(s);
    for( i=0;s[i]!='\0';i++ )    //s[i]就相当于 s[i]!='\0'  这是大神们的一种炫酷写法 
    {
        int index=s[ i ];
        if ( index >=0 && index <= 127 )
            carr[index]++ ;     //程序所有焦点或者核心 就这一句代码 ,这个自己细细体会 
                                //简单举例,比如你输入E (E的ascii码值为69) 那么carr[69]+=1 什么意思,自己琢磨一下
    }
    for( i=0;i<128;i++ )
        if ( carr[ i ] > 1 )
            printf("%c:%d\n", i, carr[ i ] );
        return 0;
}

代码

代码

结果

结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-16 11:45:52 | 显示全部楼层
这不就是统计有哪些字符是重复的 并重复次数是多少
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 11:47:56 | 显示全部楼层
原理很简单
设置了几个盒子比如0-9a-zA-Z  这就是62个盒子,每个盒子都用自己的码值做索引
开始时 清零   ,然后检索字符串时  遇到码值与索引值相同 则自增
最后能统计出所有字符出现的频次,凡是大于等于2的 都打印出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 12:13:40 | 显示全部楼层
wp231957 发表于 2021-3-16 11:47
原理很简单
设置了几个盒子比如0-9a-zA-Z  这就是62个盒子,每个盒子都用自己的码值做索引
开始时 清零   ...


感谢感谢!虽然大概是听懂一些了,但这个 for( i=0;s[ i ] ; i++),这里s[ i ] 是一个什么条件
还有这个carr [ index ]++又是代表了什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 13:01:39 | 显示全部楼层
已解决!
以下是我的理解:
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次的结果。
112.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-16 13:01:47 | 显示全部楼层    本楼为最佳答案   
yuhang2020 发表于 2021-3-16 12:13
感谢感谢!虽然大概是听懂一些了,但这个 for( i=0;s[ i ] ; i++),这里s[ i ] 是一个什么条件
还有这 ...

#include<stdio.h>
int main()
{
    char s[1024]={'\0'};   //这里是储存原始字符串的(待统计字符串)
    int carr[128]={0};   //可见ascii码都是小于128的,这里全部初始为0,本题中就是每个ascii码值对应的频次为0
    int i;
    printf("input a string: ");
    gets(s);
    for( i=0;s[i]!='\0';i++ )    //s[i]就相当于 s[i]!='\0'  这是大神们的一种炫酷写法 
    {
        int index=s[ i ];
        if ( index >=0 && index <= 127 )
            carr[index]++ ;     //程序所有焦点或者核心 就这一句代码 ,这个自己细细体会 
                                //简单举例,比如你输入E (E的ascii码值为69) 那么carr[69]+=1 什么意思,自己琢磨一下
    }
    for( i=0;i<128;i++ )
        if ( carr[ i ] > 1 )
            printf("%c:%d\n", i, carr[ i ] );
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-16 13:04:23 | 显示全部楼层

非常感谢!!我已通过你的回复解决了此问题!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 05:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表