443316732 发表于 2020-8-4 13:00:57

C:S1E8字符和字符串作业问题

本帖最后由 443316732 于 2020-8-4 13:02 编辑

#include <stdio.h>

int main()
{
    char name;
    float height, weight;

    printf("请输入您的姓名:");
    scanf_s("%s", name);

    printf("请输入您的身高(cm):");
    scanf_s("%f", &height);

    printf("请输入您的体重(kg):");
    scanf_s("%f", &weight);

    printf("========== 正在为您转换 ==========\n");

    height = height / 2.54; // 厘米转换为英寸
    weight = weight / 0.453; // 公斤转换为磅

    printf("%s的身高是%.2f(in),体重是%.2f(lb)。\n", name, height, weight);

    return 0;
}

        萌新求助大佬,说下这个题自己找错的路程
第一次我找到了scanf函数现在已经不用了因此将旧版本的scanf替换成了scanf_s
后面以为是name前没加&的原因后来查了一下发现可以不用加,实在找不到答案了百度也没有原题所以来求助论坛里的大佬

zltzlt 发表于 2020-8-4 13:02:54

试试下面这段代码:

#include <stdio.h>

int main()
{
    char name;
    float height, weight;

    printf("请输入您的姓名:");
    scanf("%s", name);

    printf("请输入您的身高(cm):");
    scanf("%f", &height);

    printf("请输入您的体重(kg):");
    scanf("%f", &weight);

    printf("========== 正在为您转换 ==========\n");

    height = height / 2.54;// 厘米转换为英寸
    weight = weight / 0.453; // 公斤转换为磅

    printf("%s的身高是%.2f(in),体重是%.2f(lb)。\n", name, height, weight);

    return 0;
}

443316732 发表于 2020-8-4 13:03:13

{:10_266:}希望大佬们不吝赐教,学的东西比较少目前还找不到问题所在

SHRS23 发表于 2020-8-4 13:04:29

scanf_s函数有三个参数!

SHRS23 发表于 2020-8-4 13:05:05

本帖最后由 SHRS23 于 2020-8-4 13:06 编辑



以下内容来自百度百科:

ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存访问越界,例如分配了5字节的空间但是读入了10字节
char buf={'\0'};
scanf("%s", buf);
如果输入1234567890,后面的部分会被写到别的空间上去。
以上代码如果用scanf_s,第二行应改为scanf_s("%s",buf,5),表示最多读取5-1个字符,因为buf要放'\0'
scanf_s最后一个参数是缓冲区的大小,表示最多读取n-1个字符.
vc++2005/2008中提供了scanf_s(),在最新的VS2015中也提供了scanf_s()。在调用时,必须提供一个数字以表明最多读取多少位字符。
3.读取单个字符也需要限定长度:scanf_s("%c,%c",&c1,1,&c2,1);而不能写成scanf_s("%c,%c",&c1, &c2,1, 1);否则编译器会报错

永恒的蓝色梦想 发表于 2020-8-4 13:09:11

本帖最后由 永恒的蓝色梦想 于 2020-8-4 13:11 编辑

你可以改成以下两种代码:
第一种:关闭警告,使用 scanf 。#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    char name;
    float height, weight;

    printf("请输入您的姓名:");
    scanf("%s", name);

    printf("请输入您的身高(cm):");
    scanf("%f", &height);

    printf("请输入您的体重(kg):");
    scanf("%f", &weight);

    printf("========== 正在为您转换 ==========\n");

    height = height / 2.54; // 厘米转换为英寸
    weight = weight / 0.453; // 公斤转换为磅

    printf("%s的身高是%.2f(in),体重是%.2f(lb)。\n", name, height, weight);

    return 0;
}
第二种:使用 scanf_s,但是 scanf_s 输入字符串多提供一个长度参数,所以应该改成这样:#include <stdio.h>

int main()
{
    char name;
    float height, weight;

    printf("请输入您的姓名:");
    scanf_s("%s", name, 256);

    printf("请输入您的身高(cm):");
    scanf_s("%f", &height);

    printf("请输入您的体重(kg):");
    scanf_s("%f", &weight);

    printf("========== 正在为您转换 ==========\n");

    height = height / 2.54; // 厘米转换为英寸
    weight = weight / 0.453; // 公斤转换为磅

    printf("%s的身高是%.2f(in),体重是%.2f(lb)。\n", name, height, weight);

    return 0;
}

443316732 发表于 2020-8-4 13:21:08

永恒的蓝色梦想 发表于 2020-8-4 13:09
你可以改成以下两种代码:
第一种:关闭警告,使用 scanf 。
第二种:使用 scanf_s,但是 scanf_ ...

谢谢!

443316732 发表于 2020-8-4 13:22:35

SHRS23 发表于 2020-8-4 13:05
以下内容来自百度百科:

ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能 ...

谢谢
页: [1]
查看完整版本: C:S1E8字符和字符串作业问题