鱼C论坛

 找回密码
 立即注册
查看: 1928|回复: 7

[已解决]你永远叫不醒一个装睡的人题目求助

[复制链接]
发表于 2020-9-21 15:29:21 | 显示全部楼层 |阅读模式

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

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

x
有这么一道题目:

你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟15-20次,脉搏是每分钟50-70次。下面给定一系列人的呼吸频率与脉搏,请你找出他们中间有可能在装睡的人,即至少一项指标不在正常范围内的人。
输入格式:

输入在第一行给出一个正整数N(≤10)。随后N行,每行给出一个人的名字(仅由英文字母组成的、长度不超过3个字符的串)、其呼吸频率和脉搏(均为不超过100的正整数)。
输出格式:

按照输入顺序检查每个人,如果其至少一项指标不在正常范围内,则输出其名字,每个名字占一行。
输入样例:

4
Amy 15 70
Tom 14 60
Joe 18 50
Zoe 21 71

输出样例:

Tom
Zoe

我写的代码如下:

#include <stdio.h>
int main()
{
    int num;
    int i;
    char name[10];
    char *bad[10];
    int maibo;
    int heart;
    int a = 0;
    scanf("%d",&num);
    for (i=0;i<num;i++)
    {
            scanf("%s%d%d",name,&maibo,&heart);
            //呼吸频率是每分钟15-20次,脉搏是每分钟50-70次
            if (maibo > 20 || maibo < 15 || heart > 70 || heart < 50)
            {
                    //非正常数据
                    //printf("%s\n",name);
                    bad[a] = name;                                       
                    a ++;                   
        }
    }

    for (int m=0;m<a;m++)
    {
            printf("%s\n",bad[m]);
        }
    return 0;
   
}

实际执行的时候,如果输入2行都是错误的数据,最后输出的bad数组只有最后一行错误数据,不知道是哪里问题?
最佳答案
2020-9-21 16:22:27
dysow 发表于 2020-9-21 16:13
代码运行是可以了,但不明白原理,我那种写法是什么问题


char * bad[10] ;定义了一个10个元素的char * 数组,
每个元素的值未初始化。
scanf("%s%d%d",name,&maibo,&heart);
输入后,name[10]的内容是发生变化的,

bad[a] = name ;只是让bad[a] 指向了name,而不是把name的内容复制到bad[a]里面,
所以,最后,每一个被赋值的bad[a]都指向了name,而name只保存了最后一个输入的内容。
所以输出全是最后输入的那个name.

我的写法是给bad[a]分配一段内存,然后把name复制到bad[a]里,因此,name的内容得到
了保存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-21 15:53:56 | 显示全部楼层
本帖最后由 xieglt 于 2020-9-21 15:59 编辑

这句有问题
bad[a] = name;
可以写成
bad[a] = (char *)mallic(10);
strcpy(bad[a],name);
或者
bad[a] = (char *)mallic(10);
sprintf(bad[a],"%s",name);


记得包含头文件
#include <string.h>
#include<stdlib.h>
最后要记得 free
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-21 16:13:47 | 显示全部楼层
xieglt 发表于 2020-9-21 15:53
这句有问题
bad[a] = name;
可以写成

代码运行是可以了,但不明白原理,我那种写法是什么问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-21 16:20:12 | 显示全部楼层
本帖最后由 行客 于 2020-9-21 16:26 编辑
dysow 发表于 2020-9-21 16:13
代码运行是可以了,但不明白原理,我那种写法是什么问题


char *bad[10];
bad是指针数组,但每一个指针并没有分配指向内存。xieglt给的回复是对内存做了分配。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-21 16:22:27 | 显示全部楼层    本楼为最佳答案   
dysow 发表于 2020-9-21 16:13
代码运行是可以了,但不明白原理,我那种写法是什么问题


char * bad[10] ;定义了一个10个元素的char * 数组,
每个元素的值未初始化。
scanf("%s%d%d",name,&maibo,&heart);
输入后,name[10]的内容是发生变化的,

bad[a] = name ;只是让bad[a] 指向了name,而不是把name的内容复制到bad[a]里面,
所以,最后,每一个被赋值的bad[a]都指向了name,而name只保存了最后一个输入的内容。
所以输出全是最后输入的那个name.

我的写法是给bad[a]分配一段内存,然后把name复制到bad[a]里,因此,name的内容得到
了保存。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-21 16:26:15 | 显示全部楼层
行客 发表于 2020-9-21 16:20
char *bad[10];
bad是指针数组,但每一个指针并没有分配指向内存。xieglt给的回复是对内存做了分配。

如果不想动态分配内存 malloc
可以这样定义 bad
char bad[10][10];
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-21 16:27:13 | 显示全部楼层
xieglt 发表于 2020-9-21 16:26
如果不想动态分配内存 malloc
可以这样定义 bad
char bad[10][10];

是的,直接定义一个二维数组,直接在栈里做操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-21 16:49:01 | 显示全部楼层
xieglt 发表于 2020-9-21 16:22
char * bad[10] ;定义了一个10个元素的char * 数组,
每个元素的值未初始化。
scanf("%s%d%d",name,& ...

那就是说我之前那个写法相当于每次都把name的地址给覆盖了,所以留下的就只有最后一个name地址了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 02:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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