bszs 发表于 2021-9-9 21:42:57

关于for语句循环课后作业的问题

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的返回值,希望大佬可以解答
最后再问一下下面的代码格式怎么搞出来的,不想再复制黏贴了

jhq999 发表于 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);
}

wp231957 发表于 2021-9-9 21:58:39

发贴时有一对尖括号,把代码放那里即可

wp231957 发表于 2021-9-9 22:02:48

int类型的用%c接收    why???

bszs 发表于 2021-9-9 22:07:57

wp231957 发表于 2021-9-9 22:02
int类型的用%c接收    why???

谢谢告知,因为我之前不是用的scanf,而是getchar()来获取字符,所以才有j=i-48;后面发现自己做不出来课后答案的效果就想照着样子改一改,看行不行。不过我觉得int i;用%c也能得出正确结果

采茝. 发表于 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

出处

bszs 发表于 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取走就没事了。

采茝. 发表于 2021-9-9 23:28:59

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

采茝. 发表于 2021-9-9 23:34:29

//2.实现 atoi 函数的功能 0~948~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;
}

采茝. 发表于 2021-9-9 23:37:18

采茝. 发表于 2021-9-9 23:34


作业13的片段

jhq999 发表于 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的值是多少?

bszs 发表于 2021-9-10 13:10:54

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

懂了懂了,我思路搞错了,不应该用字符型,谢谢大佬
页: [1]
查看完整版本: 关于for语句循环课后作业的问题