| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2206 人关注过本帖, 1 人收藏
标题:C语言入门,代码错误,但是我实在看不出来那里错误,
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
// 若使用TC/BC/VC6等编译器,把下面代码的scanf_s()/printf_s()函数改成scanf()/printf()即可

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <conio.h>

const int CHARS_NUMBER = 3;
const char END_CHAR = '#';

int main(void)
{
    int counter;                // 读入字符计数器
    char ch[CHARS_NUMBER];

    for ( ; ; )
    {
        printf_s("请输入%d个字符,可用空格或制表符、回车分隔,甚至不分隔,输入%c结束程序:\n", CHARS_NUMBER, END_CHAR);
        counter = 0;
        while (counter < CHARS_NUMBER)
        {
            while (scanf_s("%1c", &ch[counter], 1) == 1)
            {
                if (ch[counter] == END_CHAR)
                {
                    goto end;    // 此处因循环嵌套太深用goto跳出,回避不用goto的方法是把本循环封装到函数中
                }
                if (isalpha(ch[counter]))
                {
                    printf_s("第%d个字符是%c\n", counter + 1, ch[counter]);
                    ++counter;
                    break;
                }
            }
        }
        putchar('\n');
        for (counter = 0; counter < CHARS_NUMBER; ++counter)
        {
            if ((ch[counter] != 'a') && (ch[counter] != 'A'))
            {
                printf_s("%c左移一位的字符为%c\n", ch[counter], ch[counter] - 1);
            }
        }
        putchar('\n');
    }

    end:
    printf_s("\n按任意键结束程序...");
    _getch();
    return EXIT_SUCCESS;
}

实际上,输入部分会过滤掉所有不符合要求的字符,比如你可以用在中间夹杂数字之类的字符测试,总之,它要读够CHARS_NUMBER个字符为止。另外,你也可以一次性输入3个以上的字符进去看看……


[ 本帖最后由 TonyDeng 于 2014-6-28 14:40 编辑 ]

授人以渔,不授人以鱼。
2014-06-28 13:56
马刀66
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2014-6-28
收藏
得分:0 
回复 30 楼 vvvcuu
谢谢,思想一样方法不同,谢谢你们
2014-06-28 14:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
scanf()函数的返回值,是它成功读入并转换的数据项数,比如你写scanf("%d %d", &x, &y),如果交互输入的时候,只有x读入成功(输入有效的数字),而y不成功(输入了字母),那么函数的返回值是1,因为它成功匹配了1个数据项,只有两个数据都成功了,才会返回2,如果一个都不成功,那么返回值是零。当你搞明白了这个函数的返回值是什么意思,就明白上面我为什么这样写,而像你原先那样写,问题又会出在哪方面,也包括之前那个EOF的问题(根本就不会返回EOF)。

授人以渔,不授人以鱼。
2014-06-28 14:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
isalpha()函数是判断字符是否(大小写)字母的。ASCII字符表中有些是不可打印的控制字符,不要贸贸然加减输出。用ctype.h中定义的函数作各种种类字符的判断,在这里,你可以不只用字母,也可以扩大范围到可打印字符,用isprint()函数,而你要知道边界字符是哪个,否则再加减就出错了。

授人以渔,不授人以鱼。
2014-06-28 14:19
马刀66
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2014-6-28
收藏
得分:0 
回复 34 楼 TonyDeng
我正在看,看得很吃力,今天麻烦你了
2014-06-28 14:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实,像我31楼这般读入数据,根本不存在一批读3个的问题,逐个字符依次不断地读就是了,读一个判断一个,不断作出取舍,不需要那层多余的循环(导致要用goto跳出),写成那样,是为了满足你原先按批读取的要求而已。逐个字符读入最有效的办法是用getchar(),比scanf()快得多,生成机器码的程序尺寸也小得多。

[ 本帖最后由 TonyDeng 于 2014-6-28 14:36 编辑 ]

授人以渔,不授人以鱼。
2014-06-28 14:32
zzhwybc555
Rank: 1
等 级:新手上路
帖 子:3
专家分:8
注 册:2014-6-28
收藏
得分:0 
回复 5 楼 TonyDeng
printf("%.2f+%.2f+%.2f=%.2f",a,b,c,d);这样就好了,自己设置小数点位数
2014-06-28 18:13
zzhwybc555
Rank: 1
等 级:新手上路
帖 子:3
专家分:8
注 册:2014-6-28
收藏
得分:0 
我发错地方了?
2014-06-28 18:14
陈安元
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2014-6-28
收藏
得分:0 
回复 38 楼 zzhwybc555
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a;
scant("%c",&a);
printf("你刚才输入的字符是%c",a);
    system("pause");
    return 0;
}
这个代码我按照书上写的但是为什么不对?显示编码失败

自学无门!论坛求神
2014-06-28 19:24
vvvcuu
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:12
帖 子:353
专家分:1253
注 册:2014-4-22
收藏
得分:0 
scanf(),  不是scant()!

代码测试环境:  WinXP+C-Free5.0.
2014-06-28 19:46
快速回复:C语言入门,代码错误,但是我实在看不出来那里错误,
数据加载中...
 
   



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

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