c常见错误汇集

关于格式化输出
引用:
为什么
int a;
a=5/2.0 a的值为2

int a=5;float b=2.0;
printf("%d",a/b) 值为0呢
By EvilOctal
问题 不在求整 上 而是在与你的 格式化输出  计算机 求取到正确的值 但是你必须让他以正确的方式输出
这个问题涉及到 数据类型转换 存储 的问题 要学 汇编 编译 才能明白 一般的C课本也不会详细说
我也不懂应该怎么给你讲 就现在你只需要知道如果a, b其中有一个是浮点数 那么应该这样写:
复制内容到剪贴板
代码:
#include <stdio.h>

int main(void)
{
     int a=5;
     float b=2.0;

     printf("%f",a/b);
     return 0;
}
才可以正常 如果想 取整  这样 定义并输出  就没问题了
复制内容到剪贴板
代码:
#include <stdio.h>

int main(void)
{
     int a=5, b=2;

     printf("%d",a/b);
     return 0;
}
如果你 实在变态  非要用 错误的方法看到正确的结果  虽然如果你真这么固执我会很担心你的健康状况 但是我一样 可以 给你个好方法解决  强制类型转换  霸王硬上弓 简称强奸
复制内容到剪贴板
代码:
#include <stdio.h>

int main(void)
{
     int a=5;
     float b=2.0;

     printf("%d",(int)(a/b));
     return 0;
}

这样一样可以看到2的结果 这样是十分不可取的 但是我保证也是没有错误没有警告


关于字符串和流的问题

引用:
老师要求写一个小程序 两次都输入How are you?
第一次系统打印How 第二次系统打印How are you?
但是为什么我写的程序
#include <stdio.h>

int main(void)
{
    char s1[5], s2[5], s3[5], str[13];
    scanf("%s", str);
    printf("%s\n", str);
    scanf("%s%s%s", s1, s2, s3);
    printf("%s %s %s\n", s1, s2, s3);
    return 0;
}
第一次打印How 第二次却打印areyou?How
这是为什么呀?
By EvilOctal
广告:多多讨论技术 欢迎来到邪恶八进制信息安全团队.....

解释:
老摩是这样的 你问的问题 不是字符数组 的问题  是字符串 的问题 但是问题却不是由于字符串引起 而是由于C语言中的 引起的...
原因是scanf("%s",str);这里读的时候 的确是如 红客之迷 说的 空格是结束符 但是 他没说全
如果你输入 How are you? 那么系统当然找到第一个空白认为How这里已经结束 因此打印的是 How
然后 你就继续输入了另外一条 How are you? 此时 按照你的思考方式 应该是How给了s1 are给了s2 you?给了s3
那么冰血告诉你 确实应该是这样的!但是为什么出错了呢?
其实你看到的 are you?How 其中的 are you? 是你第一次输入后剩下在缓冲区里的...
明白了么?
当系统截断了你 第一次输入 How are you? 的时候把你的 are you? 留在了缓冲区里(多么可怕的疏忽 是一个不安全的程序)...打印How后  are you? (还有一个回车)被一起给了下面的s1和s2
第二次 你不经过任何处理 直接输入 How are you?  这个时候只有s3空着接受了你的第一个 How
因此打印的结果成了
areyou?How

为了证明我的解释是正确的  你可以再加两个字符数组来接收字符串 把你的程序这样修改
复制内容到剪贴板
代码:
#include <stdio.h>

int main(void)  //EvilOctal提醒您请注意用C99的格式编写您的源代码
{
    char s1[5], s2[5], s3[5], str[13];
    char s4[5], s5[5];

    scanf("%s", str);
    printf("%s\n", str);

    scanf("%s%s%s%s%s", s1, s2, s3, s4, s5);
    printf("%s%s%s%s%s\n", s1, s2, s3, s4, s5);

    return 0;
}
你将看到这样的结果(黑体是您输入的 普通的字体是系统打印出来的内容 红色字是在缓冲区的内容):
How are you?回车
How  are you?回车
How are you?
areyou?Howareyou?
怎么样?冰血清白了吧?:)

那你想看到正确的结果该怎么办 呵呵 只要清理一下缓冲区就可以了...这样修改程序:
复制内容到剪贴板
代码:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char s1[5], s2[5], s3[5], str[13];

    scanf("%s", str);
    printf("%s\n", str);

    fflush(stdin);

    scanf("%s%s%s", s1, s2, s3);
    printf("%s %s %s\n", s1, s2, s3);

    return 0;
}
这样 您将看到
How are you?回车
How  are you?回车
(被fflush函数把are you?刷掉....)
How are you?
How are you?

这是个典型问题 一定要注意 否则容易间接造成溢出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值