| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 564 人关注过本帖
标题:感觉很神奇,变换一下得到的结果一样,但我想不出其中的原因
只看楼主 加入收藏
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:14 
感觉很神奇,变换一下得到的结果一样,但我想不出其中的原因
#include<stdio.h>
#include<ctype.h>
int main()
{
    char str[100];
    int i;
    int a=0;             //判断字母函数
    printf("输一个字符串:\n");
    gets(str);
    for(i=0;str[i];i++)
    {
        if(isalpha(str[i]))
            a+=1;
    }
    printf("字母有%d个\n",a);
    return 0;
}
以上是第一个代码,下面是另外一个代码:

#include<stdio.h>
#include<ctype.h>
int main()
{
    char str[100]={"\0"};
    int i;
    int a=0;             //判断字母函数
    printf("输一个字符串:\n");
    gets(str);
    for(i=0;i<100;i++)
    {
        if(isalpha(str[i]))
            a+=1;
    }
    printf("字母有%d个\n",a);
    return 0;
}
这两个代码有不同之处,第一个代码的str[100]没有初始化,for语句的判断式为str[i];第二个代码的str[100]初始化为str[100]={"\0"},for语句的判断式为i<100,就这两个地方我不明白,实际上两者运行后得到的结果是一样的,同样可以测出字符串有多少个字母,求解释
另外,还有一点不明白的是:
#include<stdio.h>
#include<ctype.h>
int main()
{
    char str[100]={"\0"};
    int i;
    int a=0;             //判断字母函数
    printf("输一个字符串:\n");
    gets(str);
    for(i=0;i<100;i++)
    {
        if(isalpha(str[i])!=0)
            a+=1;
    }
    printf("字母有%d个\n",a);
    return 0;
}加颜色的那部分,本来我是这样的:if(isalpha(str[i]))这样写可以计算出字符串的字母数,但是我要是改为if(isalpha(str[i])==1),就不能输出正确结果了,但再换回if(isalpha(str[i])!=0)却又能输出正确结果,为什么?我个人认为==1与!=0的效果应该是一样的啊?为什么却无法实现呢?

[ 本帖最后由 love云彩 于 2012-12-23 15:02 编辑 ]
搜索更多相关主题的帖子: 字符串 return include 字母 
2012-12-23 14:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
两个代码的效果是一样的,初始化与否都无关重要,因为你都通过gets()重新调整了数组的数据。效果一样的根本原因是使用isalpha()函数,无论你循环到'\0'为止,还是把整个数组100个元素都看一遍,isalpha()检索每一个元素计数,结果都一样,因为没有什么随机数据会恰好令isalpha()返回真。

授人以渔,不授人以鱼。
2012-12-23 15:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
顺便说一下,你第二个代码下面的初始化语法是错的:
char str[100]={"\0"};

授人以渔,不授人以鱼。
2012-12-23 15:18
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 3楼 TonyDeng
这样初始化不行吗?但运行能得到结果哦,还有帮我解决一下for语句中的判断式为什么能用str[i]表示吧

思考赐予新生,时间在于定义
2012-12-23 15:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你的编译器不报警,不负责咯,强硬忽略当然可以运行。
for()循环那个是判断str[i]是否非0,遇到0结束循环。

授人以渔,不授人以鱼。
2012-12-23 15:45
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
回复 5楼 TonyDeng
还有一个问题哦,就是那个if(isalpha(str[i])),它这样可以输出结果了,但换成这样if(isalpha(str[i])!=0)也行,我觉得!=0与==1的效果应该是一样的,就换成if(isalpha(str[i])==1)来试试,结果却不行,怎么回事呢

思考赐予新生,时间在于定义
2012-12-23 16:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
对C来说,只有0是假,非0是真,真未必是1。可以与0判断真假,但不可以与1判断真假。isalpha()返回真假,只有假是0,真未必是1。
另外,你短信中的问题,for()循环结束的条件str[i],是对这个表达式求值,结果如果是0,表示终结循环,任何非0的值,都是继续循环的。
这是利用了C语言的逻辑值特性写出的代码,也仅C是这样。

授人以渔,不授人以鱼。
2012-12-23 17:28
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
以下是引用TonyDeng在2012-12-23 15:18:46的发言:

顺便说一下,你第二个代码下面的初始化语法是错的:
char str[100]={"\0"};

你说我这样的初始化是错误的,那应该怎样初始化呢?是不是char str[100]={'\0'}这样?

思考赐予新生,时间在于定义
2012-12-23 18:47
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
#include<stdio.h>
#include<ctype.h>
int main()
{
    char str[100];
    int i;
    int a=0;             //判断字母函数
    printf("输一个字符串:\n");
   scanf("%s",str);
    for(i=0;str[i];i++)
    {
        if(isalpha(str[i]))
            a+=1;
    }
    printf("字母有%d个\n",a);
    return 0;
}我用scanf来输入字符串,如果我输入的字符串是含有空格的,比如下面的截图
图片附件: 游客没有浏览图片的权限,请 登录注册

abcdef ghi之间有一个空格,最后的结果是6个字母,我可不可以就这样认为使用scanf输入一个字符串,不能输入'\0'空格符号,这样的说法正确吗?

思考赐予新生,时间在于定义
2012-12-23 18:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
双引号括着的东西是字符串数组char[],不是字符char,你的数组str被定义为每个元素都是char,不是char[],所以"\0"是一个静态字符串的地址,赋给定义为char的变量是违反声明逻辑的。如果这个编译器对此没有提出警告(虽然C容许把指针通过截断强制转换为char型整数),那么也应该考虑这个编译器的可靠性了,应该有警告信息的,估计是你忽略了。

授人以渔,不授人以鱼。
2012-12-23 18:55
快速回复:感觉很神奇,变换一下得到的结果一样,但我想不出其中的原因
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017239 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved