鱼C论坛

 找回密码
 立即注册
查看: 1672|回复: 11

[已解决]关于for语句循环课后作业的问题

[复制链接]
发表于 2021-9-9 21:42:57 | 显示全部楼层 |阅读模式
10鱼币
int main()
{
        int num = 0;
        long sum = 0L; // 0L表示类型为long的0
        int status;

        do
        {
                printf("请输入合法的数字:");
                sum = sum + num;
                status = scanf("%d", &num);
        } while(status == 1);
        printf("结果是:%ld\n", sum);

        return 0;
}
上面这一段是课后作业答案,我试了一下,程序运行以后可以输入一个数字按一下回车之后接着输入数字
但是我自己写的无法做到输入一个数字按下回车可以再输入,直到输入字符再结束运行,如下
#include<stdio.h>
int main()
{
    int i,j,sum=0;
    printf("请输入合法的数字:");
    scanf("%c",&i);
    j=i-48;
    while(j<=9&&j>=0)
    {
        printf("请输入合法的数字:");
        sum=sum+j;
        scanf("%c",&i);
        j=i-48;
    }
    printf("%d",sum);
}
有哪些不同?另外扩展知识的scanf没看懂,没搞明白scanf的返回值,希望大佬可以解答
最后再问一下下面的代码格式怎么搞出来的,不想再复制黏贴了
最佳答案
2021-9-9 21:42:58
本帖最后由 jhq999 于 2021-9-9 23:07 编辑

网上摘抄的:
scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。
当scanf函数的第一个变量格式不正确时返回值为0,即,当scanf函数的第n个变量格式不正确时,返回值为n-1

%c,只给变量i第一个字节赋值,把i=0;就可以了,养成尽量给变量赋个初值的习惯,一般都为0
int main()
{
    int i=0,j,sum=0;
    printf("请输入合法的数字:");
    scanf("%c",&i);
    getchar();我这个是VS2012所以必须用getchar();接收上面scanf()遗留下的'\n'.要不然下面的scanf()直接接受一个'\n'向下运行。
    j=i-48;
    while(j<=9&&j>=0)
    {
        printf("请输入合法的数字:");
        sum=sum+j;
        i=0;
        scanf("%c",&i);
        getchar();//我这个是VS2012所以必须用getchar();接收上面scanf()遗留下的'\n'.
        j=i-48;
    }
    printf("%d",sum);
}
S1E14:for语句和循环嵌套 _ 课后测试题及答案,《带你学C带你飞》【第一季】,C_C  交.png

最佳答案

查看完整内容

网上摘抄的: scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。 当scanf函数的第一个变量格式不正确时返回值为0,即,当scanf函数的第n个变量格式不正确时,返回值为n-1 %c,只给变量i第一个字节赋值,把i=0;就可以了,养成尽量给变量赋个初值的习惯,一般都为0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-9 21:42:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2021-9-9 23:07 编辑

网上摘抄的:
scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。
当scanf函数的第一个变量格式不正确时返回值为0,即,当scanf函数的第n个变量格式不正确时,返回值为n-1

%c,只给变量i第一个字节赋值,把i=0;就可以了,养成尽量给变量赋个初值的习惯,一般都为0
int main()
{
    int i=0,j,sum=0;
    printf("请输入合法的数字:");
    scanf("%c",&i);
    getchar();我这个是VS2012所以必须用getchar();接收上面scanf()遗留下的'\n'.要不然下面的scanf()直接接受一个'\n'向下运行。
    j=i-48;
    while(j<=9&&j>=0)
    {
        printf("请输入合法的数字:");
        sum=sum+j;
        i=0;
        scanf("%c",&i);
        getchar();//我这个是VS2012所以必须用getchar();接收上面scanf()遗留下的'\n'.
        j=i-48;
    }
    printf("%d",sum);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-9 21:58:39 From FishC Mobile | 显示全部楼层
发贴时有一对尖括号,把代码放那里即可
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-9 22:02:48 From FishC Mobile | 显示全部楼层
int类型的用%c接收    why???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-9 22:07:57 | 显示全部楼层
wp231957 发表于 2021-9-9 22:02
int类型的用%c接收    why???

谢谢告知,因为我之前不是用的scanf,而是getchar()来获取字符,所以才有j=i-48;后面发现自己做不出来课后答案的效果就想照着样子改一改,看行不行。不过我觉得int i;用%c也能得出正确结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-9 23:05:05 | 显示全部楼层
关于scanf返回值问题相关的回答
void main()
{
int a;
int b;
int c;
printf("请输入三个整数:");
int x=scanf("%d%d%d",&a,&b,&c);
printf("%d/n%d/n",a,x);
}
1.scanf()函数有返回值且为int型。
2.scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。
从上边的例子中可以得到验证,这里用变量x接收scanf()函数的返回值,并输出显示出来。

当运行中输入三个整数:5 6 7则x的值为3;

如果输入5 6 d(即给c 赋值不正确)则x的值为2;

如果输入5 t d(即给b和c 赋值不正确)则x的值为1;

当scanf函数的第一个变量格式不正确时返回值为0,即,当scanf函数的第n个变量格式不正确时,返回值为n-1

  出处
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-9 23:23:03 | 显示全部楼层
jhq999 发表于 2021-9-9 22:51
网上摘抄的:
scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。
...
#include<stdio.h>
int main()
{
    int i,j,sum=0;
    printf("请输入合法的数字:");
    scanf("%c",&i);
    getchar();
    j=i-48;
    while(j<=9&&j>=0)
    {
        printf("请输入合法的数字:");
        sum=sum+j;
        scanf("%c",&i);
        getchar();
        j=i-48;
    }
    printf("%d",sum);
}
感谢解答,不过问题不在这,我才发现在我输入第一个数字(也就是数字字符)的时候,存入缓冲区里的有两个字符,一个是数字一个是\n,第一个scanf读取到了数字但是缓冲区里还有一个\n留给循环里面的scanf了,所以是直接退出,我在两个scanf函数下面都加了一个getchar(),把\n取走就没事了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-9 23:28:59 | 显示全部楼层
char 普遍认为所占内存空间为1字节
int                                       4字节
用1字节空间的内存装4字节大小的变量?
应该是数据发生了数据截断或者数据溢出
图三的错位提示: 警告        C6328        大小不匹配: 已将“int”作为 _Param_(2) 传递,但需要使用“char operand”来调用“scanf”。这表示可能存在严重错误。若针对像 scanf 这样的函数报告此信息,可能表示发生缓冲区不足或溢出。                

1.png
2.png
3.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-9 23:34:29 | 显示全部楼层
 //2.实现 atoi 函数的功能 0~9  48~57
 
#include<stdio.h>
int main()
{

char ch;
 int CH;
 //int count = 0;
 while ((ch = getchar()) != '\n')
 {
     if (ch >= 48 && ch <= 57)
     {
         ch -= 48;
         CH = (int)ch;
         printf("%d", CH);
         //count++;
     }
     else
         break;

 }

     return 0;
 }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-9 23:37:18 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-10 07:16:50 | 显示全部楼层
本帖最后由 jhq999 于 2021-9-10 07:25 编辑
采茝. 发表于 2021-9-9 23:28
char 普遍认为所占内存空间为1字节
int                                       4字节
用1字节空间的内存 ...


不是告诉你你的变量i没赋初值吗?%c只改变其中第一个字节,你中断时用十六位显示scanf后的i值和你输入的十六位字符值对比一下
难道我前面表达的不清晰?
你在第一个 printf("请输入合法的数字:");中断,看看i没有赋值为0的值是多少?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-10 13:10:54 | 显示全部楼层
jhq999 发表于 2021-9-10 07:16
不是告诉你你的变量i没赋初值吗?%c只改变其中第一个字节,你中断时用十六位显示scanf后的i值和你输入 ...

懂了懂了,我思路搞错了,不应该用字符型,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 18:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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