C程序训练:与输入有关的错误

在录入程序时有时稍不注意就可能录入错误的字符导致程序运行结果出现错误,下面举例说明。

下面程序的运行结果是错的,但程序又没有错,到底问题出现在哪呢?

#include <stdio.h>
int main()
{
    FILE *fp;
    int i, k, n;
    fp=fopen("data.dat", "w+");
    for(i=1; i<6; i++)  {
       fprintf(fp,"%d ",i);
       if(i%3==0) {
          fprintf(fp,"\n");
       }
    }
    rewind(fp);
    fscanf(fp, "%d%d",&k,&n);
    printf("%d %d\n",k,n);
    fclose(fp);
    return 0;
}

程序运行结果是:

图片

并且在不同的机器上运行的结果可能不同,例如结果可能是:

1   20

1   -858993460

检查程序,也没有看出问题来,打开文件的方式是"w+",这意味着对一个文本文件进行读写,如果打开文件时文件不存在,则创建,否则打开已存在文件,截断所有内容,从头再写,然后可以读。

百思不得其解,后来对fprintf(fp,"%d ",i);进行查看,无意间发现光标在移过空格时和平时的印象不一样,仔细分析,发现了问题,此处的字符“ ”不是空格字符“ ”。那么“ ”到底是什么?我们把它拿出来,编写程序看看它的原形,程序如下:


#include <stdio.h>
#include <string.h>
int main()
{
  char str[]={" "};
  int len=strlen(str); 
  printf("len=%d\n",strlen(str));
  for(i=0; i<len; i++) {
    printf("%2x ",str[i]&0xff );
  }
  printf("\n");
  return 0;
}

运行结果如下图所示。

图片

该字符长度为2,这两个字节值都是0xa1,它中文语境中用它来作为空格的,有的中文输入法,在输入空格时,可能用它代替空格。

问题找到了,用空格' '替换' ',程序运行结果正确,输出结果是:

1  2

在实训中,我们同样遇到一个类似的错误,程序如下:


/* 编写函数:用来判断一个整数是否满足"用3除余1,
  用5除余3,用7除余4”,满足则返回1,不满足返回0,
  然后编写main函数,输入范围m和n,通过调用该函数
  显示出m~n之间满足该条件的数。
*/ 
#include <stdio.h>
int fun(int s, int t) 
{
   for(int i=s; i<=t; i++) {
     if(i%3==1 && i%5==3 && i%7==4) {
       return i; 
     }         
   }
   return -1;
}
int main()
{
   int s,t,num;
   scanf("%d,%d",&s,&t);
   do {
     num = fun(s,t);
     if (num>=0){
       printf("%d ",num);
     } 
     s=num+1;
   }while(num>=0);   
   return 0;
}

显然,这个结果与我们预想的不一样,为什么?

在第19行要求输入数据时以逗号为分隔符,我们在输入数据时也是用逗号作为分隔符的,为什么错呢?

细心观察输入逗号,发现它非常的圆润,不像西文的逗号,问题是不是它呢?再次运行,结果正确了。

图片

可见,在输入时也需要区分中西文符号的不同。

如何避免这个问题的出现呢?

一种方法就是在scanf中不要使用分隔符,在输入数据时用空白符作为分隔符录入数据,因此,第19行改为scanf("%d%d",&s,&t); 就可以避免这类错误。

第二种方法,在输入时进行判断,如果没有接收到正确的输入,那就再次输入。

第19行的语句用下面的语句块替代:

while (scanf("%d,%d",&s,&t)!=2) {

      printf("Input error, try again.\n");

      while(getchar()!='\n');

参考文献:

[1]李红卫,李秉璋. C程序设计与训练(第四版)[M],大连,大连理工大学出版社,2003.

[2]https://pan.baidu.com/s/17ZXphwqySNIsIgcGtYMjvg?pwd=lhwc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/318676.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】Linux 系统编程——cd 命令

文章目录 1.命令概述2.命令格式3.常用选项4.相关描述5.参考示例 1.命令概述 “cd 命令&#xff0c;即 ‘change directory’ 的缩写&#xff0c;主要用于 Unix、Linux 和 macOS 等操作系统中&#xff0c;用于改变当前工作目录。该命令支持绝对路径和相对路径两种形式。若未指定…

肉类加工过程中的分子营养变化

谷禾健康 由于肉类和肉制品含有丰富的脂质和蛋白质&#xff0c;因此易于发生氧化反应。脂质氧化会产生一系列氧化衍生物&#xff0c;主要影响食物的颜色和风味&#xff0c;同时也会导致肌肉蛋白质的功能和稳定性丧失。同样&#xff0c;蛋白质容易被活性氧化物质(ROS)和氧化应激…

用ChatGPT写论文的重要指令

使用ChatGPT写论文&#xff0c;chatgpt3.5的普通版本与ChatGPTPLUS版本我都尝试过&#xff0c;这里我还是比较喜欢ChatGPTPLUS来写论文 快速订阅ChatGPTPLUS方法&#xff0c;0年费、0月费 具体步骤可参考 亲测&#xff0c;Chatgpt4.0充值&#xff08;虚拟卡充值&#xff09;-…

[Kubernetes]8. K8s使用Helm部署mysql集群(主从数据库集群)

上一节讲解了K8s包管理工具Helm、使用Helm部署mongodb集群(主从数据库集群),这里来看看K8s使用Helm部署mysql集群(主从数据库集群) 一.Helm 搭建mysql集群 1.安装mysql不使用persistence(无本地存储) 无本地存储:当重启的时候,数据库消失 (1).打开官网的应用中心 打开应用中…

PyTorch损失函数

一、损失函数是什么 损失函数&#xff1a;衡量模型输出与真实标签的差异 class _Loss(Module):def __init__(self, size_averageNone, reduceNone, reductionmean):"""Loss函数的基类&#xff0c;定义了一些通用的属性和方法。参数&#xff1a;- size_average…

linux相关操作

1&#xff1a;掌握虚拟机快照的制作和还原 然后转到就欧克了&#xff0c;相当于游戏存档。 2&#xff1a;linux基础命令 1&#xff1a;掌握linux系统的目录结构 linux没有盘符概念&#xff0c;只有一个根目录/&#xff0c;所有文件都在它之下 路径的描述方式&#xff1a; 在l…

canvas设置图形图案、文字图案

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

人声处理用什么软件好 FL Studio 怎么修人声 人声处理软件 人声处理步骤

一、人声处理用什么软件好 现在人声处理软件还是非常多的&#xff0c;有专门的人声处理软件&#xff0c;也有具备人声处理功能的编曲软件。专门人声处理的软件操作比较简单&#xff0c;但是处理后的人声在使用的时候可能还需要进行再处理&#xff0c;这会比较麻烦。具备人声处…

瑞幸黑金鹿王者霸屏尊享权益的技术实现方式探讨

上周六&#xff0c;公司加班举办技术专场招聘活动&#xff0c;在忙碌的下午茶歇时间&#xff0c;我尊敬的伟大的韩百万老师提议带着我去瑞幸装了个 BI&#xff0c;扫码领取咖啡的那一个瞬间&#xff0c;瑞幸店内的电视大屏上赫然显示了&#xff1a;韩百万。回来的路上我虚心请教…

基于Go框架,Cloudreve个人免费开源网盘系统源码,支持云存储(七牛、阿里云OSS、腾讯云COS、又拍云、OneDrive)

源码介绍 在数字化时代&#xff0c;我们经常需要存储、分享大量的文件&#xff0c;如照片、视频、文档等。然而&#xff0c;许多商业网盘服务却存在限速、收费等问题&#xff0c;给用户带来诸多不便。现在&#xff0c;我们为您推荐一款免费开源的网盘系统——Cloudreve。 Clo…

多维时序 | Matlab实现GRO-CNN-BiLSTM-Attention淘金算法优化卷积神经网络-双向长短期记忆网络结合注意力机制多变量时间序列预测

多维时序 | Matlab实现GRO-CNN-BiLSTM-Attention淘金算法优化卷积神经网络-双向长短期记忆网络结合注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GRO-CNN-BiLSTM-Attention淘金算法优化卷积神经网络-双向长短期记忆网络结合注意力机制多变量时间序列预测效果一览基…

《GreenPlum系列》GreenPlum初级教程-02GreenPlum单节点安装

文章目录 第二章 GreenPlum安装1.Docker创建centos容器1.1 拉取centos7镜像1.2 创建容器1.3 进入容器1.4 容器和服务器免密操作1.4.1 生成密钥1.4.2 拷贝密钥 1.5 安装ssh服务和网络必须应用1.6 容器设置root密码1.6.1 安装passwd应用1.6.2 容器本机root设置密码 1.7 容器本机免…

用模方软件进行模型的透明贴图,为什么翻出来透明部分是黑的?

答&#xff1a;透贴需要用PNG格式。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能&#xff0c;支持一键自动提取房屋结构&#xff0c;平均1栋复杂建筑物只需3…

Next.js 集成 Auth0 登入和自定义登入页面

Next.js 集成 Auth0 和自定义登入页面 注册账号和基本配置进入 auth0 官网注册账号并登入进入控制台后访问 Applications/Applications进入程序配置页面添加配置 在 Next.js 使用在项目中集成 通过 Auth0Lock 配置方式自定义登入页面效果展示实现过程 注册账号和基本配置 进入…

NeRF 其二:Mip-NeRF

NeRF 其二&#xff1a;Mip-NeRF 1. 混叠图像中的混叠现象 2. 如何抗混叠3. NeRF 中的解决方案4. 圆锥台近似计算与集成位置编码4.1 圆锥台采样4.2 三维高斯逼近圆锥台4.3 集成位置编码 5. Mip-NeRF 与 NeRF 的比较5.1 位置编码与集成位置编码5.2 采样差异5.3 网络数量 Referenc…

力扣2182.构造限制重复的字符串

思路&#xff1a;先记录每个字符的出现次数&#xff0c;构建一个新字符串&#xff0c;从尾取字符&#xff0c;每取一个该字符个数-1&#xff0c;若该字符已经取到有repeatLimit个&#xff0c;则递归取次大的字符&#xff0c;并对应字符个数-1&#xff0c;若没有次大字符了&…

漏洞复现-nginxWebUI runCmd前台远程命令执行漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

TDA4VM,SBL启动

文章目录 参考make BOARD=j721e_evm CORE=mcu1_0 BUILD_PROFILE=release pdk_libs -sj参考:https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1201734/tda4vm-error-while-loading-shared-libraries-libtinfo-so-5-for-building-sdl-in-sdk-0805

【Flutter 开发实战】Dart 基础篇:List 详解

嗨&#xff0c;各位朋友们&#xff0c;欢迎来到这篇博客&#xff01;今天我们将一起踏入 Dart 语言的神奇世界&#xff0c;深入了解 Dart 中的 List 类型。不用担心&#xff0c;我会尽可能用最通俗易懂的语言&#xff0c;让你对 List 有一个更深刻的理解。 Dart 中的 List Li…

机器学习算法理论:线性回归

线性回归 回归的理论解释&#xff1a;回归分析是确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法。按照自变量和因变量之间的关系类型&#xff0c;可分为线性回归分析和非线性回归分析。 如果在回归分析中&#xff0c;只包括一个自变量和一个因变量&#xff0c;…