关于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 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);
}
发贴时有一对尖括号,把代码放那里即可 int类型的用%c接收 why??? wp231957 发表于 2021-9-9 22:02
int类型的用%c接收 why???
谢谢告知,因为我之前不是用的scanf,而是getchar()来获取字符,所以才有j=i-48;后面发现自己做不出来课后答案的效果就想照着样子改一改,看行不行。不过我觉得int i;用%c也能得出正确结果
关于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
出处 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取走就没事了。 char 普遍认为所占内存空间为1字节
int 4字节
用1字节空间的内存装4字节大小的变量?
应该是数据发生了数据截断或者数据溢出
图三的错位提示: 警告 C6328 大小不匹配: 已将“int”作为 _Param_(2) 传递,但需要使用“char operand”来调用“scanf”。这表示可能存在严重错误。若针对像 scanf 这样的函数报告此信息,可能表示发生缓冲区不足或溢出。
//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:34
作业13的片段 本帖最后由 jhq999 于 2021-9-10 07:25 编辑
采茝. 发表于 2021-9-9 23:28
char 普遍认为所占内存空间为1字节
int 4字节
用1字节空间的内存 ...
不是告诉你你的变量i没赋初值吗?%c只改变其中第一个字节,你中断时用十六位显示scanf后的i值和你输入的十六位字符值对比一下
难道我前面表达的不清晰?
你在第一个 printf("请输入合法的数字:");中断,看看i没有赋值为0的值是多少? jhq999 发表于 2021-9-10 07:16
不是告诉你你的变量i没赋初值吗?%c只改变其中第一个字节,你中断时用十六位显示scanf后的i值和你输入 ...
懂了懂了,我思路搞错了,不应该用字符型,谢谢大佬
页:
[1]