dysow 发表于 2020-9-21 15:29:21

你永远叫不醒一个装睡的人题目求助

有这么一道题目:

你永远叫不醒一个装睡的人 —— 但是通过分析一个人的呼吸频率和脉搏,你可以发现谁在装睡!医生告诉我们,正常人睡眠时的呼吸频率是每分钟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;
    char *bad;
    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 = name;                                     
                    a ++;                   
        }
    }

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

实际执行的时候,如果输入2行都是错误的数据,最后输出的bad数组只有最后一行错误数据,不知道是哪里问题?

xieglt 发表于 2020-9-21 15:53:56

本帖最后由 xieglt 于 2020-9-21 15:59 编辑

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


记得包含头文件
#include <string.h>
#include<stdlib.h>
最后要记得 free

dysow 发表于 2020-9-21 16:13:47

xieglt 发表于 2020-9-21 15:53
这句有问题
bad = name;
可以写成


代码运行是可以了,但不明白原理,我那种写法是什么问题

行客 发表于 2020-9-21 16:20:12

本帖最后由 行客 于 2020-9-21 16:26 编辑

dysow 发表于 2020-9-21 16:13
代码运行是可以了,但不明白原理,我那种写法是什么问题

char *bad;
bad是指针数组,但每一个指针并没有分配指向内存。xieglt给的回复是对内存做了分配。

xieglt 发表于 2020-9-21 16:22:27

dysow 发表于 2020-9-21 16:13
代码运行是可以了,但不明白原理,我那种写法是什么问题

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

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

我的写法是给bad分配一段内存,然后把name复制到bad里,因此,name的内容得到
了保存。

xieglt 发表于 2020-9-21 16:26:15

行客 发表于 2020-9-21 16:20
char *bad;
bad是指针数组,但每一个指针并没有分配指向内存。xieglt给的回复是对内存做了分配。

如果不想动态分配内存 malloc
可以这样定义 bad
char bad;

行客 发表于 2020-9-21 16:27:13

xieglt 发表于 2020-9-21 16:26
如果不想动态分配内存 malloc
可以这样定义 bad
char bad;

是的,直接定义一个二维数组,直接在栈里做操作

dysow 发表于 2020-9-21 16:49:01

xieglt 发表于 2020-9-21 16:22
char * bad ;定义了一个10个元素的char * 数组,
每个元素的值未初始化。
scanf("%s%d%d",name,& ...

那就是说我之前那个写法相当于每次都把name的地址给覆盖了,所以留下的就只有最后一个name地址了
页: [1]
查看完整版本: 你永远叫不醒一个装睡的人题目求助