零碎的代码笔记之C语言
此篇笔记仅仅只是作为零散的知识点记录以及记录下自己在学习过程中遇见的一些问题并提供了解决方案
最近在用C语言写数组循环左移时出现了一个问题:
用while循环输入字符进不去循环,以下是原题目和代码:
循环左移问题
题目内容:
设计分治算法实现将字符数组A[n]中所有元素循环左移k个位置,例如,对abcdefgh循环左移3位得到defghabc。
输入格式:
第一行为数组长度n
第二行为循环左移数k
第三行为数组中元素
输出格式:
循环左移k个位置后的结果
输入样例:
8
3
abcdefgh
输出样例:
defghabc
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int n; //数组长度
int k; //左移位数
char a[100];
int i,j;
char temp; //保存数据
scanf("%d",&n); //输入数组长度
scanf("%d",&k); //输入左移位数
i=0;
while((a[i]=getchar())!='\n')
i++;
a[i]='\0';
for(j=0;j<k;j++){ //左移次数
temp=a[0]; //保留首位
for(i=0;i<n;i++){
a[i]=a[i+1];
if(i==n-1)
a[i]=temp;
}
}
for(i=0;a[i]!='\0';i++){
if(i==n-1)
putchar(a[i]);
else
putchar(a[i]);
}
return 0;
}
程序运行结果发现,并不能正确的输入数组,经过调试,找到问题——while循环并没有进行,程序跳过while循环进行下一步(っ °Д °;)っ emmmm问题出在哪里?
然后我感觉问题出在回车字符上面,于是就百度了一下,看了一遍scanf函数和getchar()函数的使用:
scanf()
在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔,则可用空格,TAB或回车作间隔。
C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。两个数据之间的分隔符被从缓冲区读出但是不起任何作用,但是最后一个’\n '会被留在缓冲区内,除非用getchar();或scanf("%c",&c);把它读出来。
getchar()
getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符. 用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
scanf("%d",&n); //输入数组长度
scanf("%d",&k); //输入左移位数
i=0;
while((a[i]=getchar())!='\n')
i++;
a[i]='\0';
在这段代码中,用scanf函数输入k值后,我按下回车键作为分隔符,那么这个回车字符已经存放在缓冲区,当下一步进行while循环时,getchar()读取缓冲区的字符,首先读取了 回车字符,循环终止,无法正确输入字符数组
解决方案有两种:
第一种:
scanf("%d",&n); //输入数组长度
scanf("%d",&k); //输入左移位数
getchar(); //或者替换为 fflush(stdin); 同样起清除缓存的作用
i=0;
while((a[i]=getchar())!='\n')
i++;
a[i]='\0';
在while循环前加一行代码:getchar();或者fflush(stdin); 两者作用结果相同。前者将’\n’从缓冲区中读出,后者将’\n’从缓冲区中清除。运行结果如下:
第二种:
scanf("%d",&n); //输入数组长度
scanf("%d",&k); //输入左移位数
for(i=0;i<n;i++)
scanf("%s",&a[i]);
使用scanf()输入数组,结果运行如下:
需要注意的是,用scanf输入字符数组时,需要输入一个字符之后用回车作为它与下一个字符之间的分隔符,但是getchar则需要连续输入
笔记到此就结束了。如果哪里有问题,欢迎大家指出,我会马上修改,感谢!d=====( ̄▽ ̄*)b