scanf()的一些内涵

scanf()的一些内涵: 
 
最近发现scanf()有很多学问,几天的学习,弄清了一些问题,现在,给大家说一说使用scanf()函数的一些值得注意的地方.不知大家有没有在编程的时侯,使用了scanf()函数后会出现一些异常情况.
1.要结束scanf()函数的输入一定要按回车键.原因就是出现在这个地方.它的作用就是从输入流提取数据.
2.输入流的指针在stdio.h文件中有宏定义#define stdin   (&_streams[0]) .也就是scanf()函数相当于:fscanf(stdin,...).
例如scanf("%d",&i); 相当于fscanf(stdin,"%d",&i); .所以,当输入流中有数据时,scanf()就从中提取数据,
不管你输入到输入流数据是什么.--我认为弄清楚这点很重要!
比如下面例子:
#i nclude<stdio.h>
#i nclude<conio.h>
int main(void)
{
  char string[10];
  int i;
  clrscr();
  for(i=0;i<10;i++)
    scanf("%c",&string[i]);

  printf("/n/n");

  for(i=0;i<10;i++)
    printf("%d/n",string[i]);

  getch();
  return 0;
}
在运行时,输入到第5字符就输入结束.
结果:
1
2
3
4
5


49
10
50
10
51
10
52
10
53
10

从结果中,大家可以看出scanf()函数从输入流中提取'/n'字符.
也就是说,每当你输入完一个字符按一下回车符,这个输入的字符被scanf()提取了.但回车符还在输入流中,
当下一次scanf()函数时,因为输入流中有数据,就不从屏幕中等待输入了,就直接提取数据.这是scanf()函数提取的是:'/n'.
也就是出现了运行中,本来要输入10次字符,结果只输入了5次.
那么有什么解救的方法呢.我能想到的方法有二种:一种是每当scanf()函数执行后,把输入流中的'/n'提取出来以便下次scanf()
能正常提取.第二种方法是每当scanf()函数执行后,把输入流的数据清空(建议不要使用这种方法).
现在以第一种方法解决:
for(i=0;i<10;i++)                      for(i=0;i<10;i++)                           for(i=0;i<10;i++)
  scanf("%c",&string[i]);  改为====>>> {  scanf("%c",&string[i]);             或   {  scanf("%c",&string[i]);
                                          getchar(); /*用来提取输入流的'/n'*/         scanf("%c",NULL);  /*用来提取输入流的'/n'*/
                                       }                                           }
现在以第二种方法解决:
for(i=0;i<10;i++)           for(i=0;i<10;i++)
 scanf("%c",&string[i]); 改为====>>> {  scanf("%c",&string[i]);
                                          fflush(stdin); /*用来清空输入流*/
                                       }
好了scanf()就说到这里吧.再学习后,再和大家分享!
 

 

### C语言实现判断输入整数是否为素数的代码逻辑分析 #### 判断素数的核心概念 素数是指除了1和它本身以外,无法被其他任何正整数整除的大于1的自然数。因此,在编写C语言程序来判断一个数是否为素数时,核心在于验证是否存在某个小于该数本身的因数能够将其整除。 #### 代码功能与逻辑解析 以下是对几种常见方法的逻辑分析: --- ##### 方法一:基于根号n优化的循环判断[^1] 此方法利用了一个重要的数学性质:如果一个合数 \( n \) 存在因子分解形式 \( n = p_1 \times p_2 \),则至少有一个因子满足 \( p_i \leq \sqrt{n} \)[^1]。这意味着只需要检查从2到\( \lfloor\sqrt{n}\rfloor \)之间的所有整数即可完成判定。 具体实现如下: ```c #include<stdio.h> #include<math.h> void ifprime(int m) { int i = (int)sqrt(m); int a = 2; for (; a <= i; a++) { if (m % a == 0) { // 如果存在任意一个小于等于 sqrt(n) 的数能整除 m,则 m 不是素数 printf("不是素数"); break; } } if (a > i) { // 循环结束后,如果没有找到可整除的数,则说明它是素数 printf("是素数"); } } int main() { int m; printf("请输入一个大于1的正整数:"); scanf("%d", &m); ifprime(m); return 0; } ``` - **优点**: 减少了不必要的计算量,提高了效率。 - **注意点**: 需要引入 `math.h` 库中的 `sqrt()` 函数用于求平方根操作。 --- ##### 方法二:简单枚举法[^3] 这种方法是最基础的方式之一,即逐一尝试将目标数值除以每一个可能的小于它的正整数直到发现第一个可以完全分割的结果为止。 示例代码如下所示: ```c #include <stdio.h> int main(){ int n, i, flag = 1; printf("Enter an integer: "); scanf("%d", &n); if (n <= 1){ flag = 0; } for(i = 2; i < n && flag != 0; ++i){ if(n % i == 0){ flag = 0; } } if(flag == 1){ printf("%d 是素数。\n", n); } else{ printf("%d 不是素数。\n", n); } return 0; } ``` - 这里通过设置标志变量 `flag` 来记录当前测试状态,一旦检测到某次模运算结果为零就立即将其置位并退出后续迭代过程从而节省时间开销[^3]。 --- ##### 方法三:计数器统计约数数量[^4] 另一种思路是从另一个角度出发——统计给定范围内有多少个不同的数字能够无余地划分待测对象。对于真正的质数而言,它们只会拥有恰好两个这样的特殊成员(也就是自身的倍率关系),而其余情形下必然会有更多符合条件者出现。 下面给出相应版本的例子供参考学习之用: ```c #include<stdio.h> int main(){ int num,count=0,i; printf("Input number:"); scanf("%d",&num); for(i=1;i<=num;i++){ if(num%i==0) count++; } if(count==2) printf("\nThe entered Number is Prime."); else printf("\nThe Entered Number Is Not APrime."); return 0; } ``` - 此处采用了一种较为直观但也相对低效的技术手段来进行分类讨论处理[^4]. --- ### 总结 以上分别介绍了三种不同风格但目的相同的算法设计方案及其背后蕴含的思想内涵。每一种都有各自适用场景以及优缺点所在,实际应用当中可以根据具体情况灵活选用最为合适的那款方案加以实施部署。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值