首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于gets()函数一个很纠结的有关问题,具体请进

2013-09-09 
关于gets()函数一个很纠结的问题,具体请进代码很长(是操作系统关于模拟先来先服务算法的),所以我事先说一

关于gets()函数一个很纠结的问题,具体请进
代码很长(是操作系统关于模拟先来先服务算法的),所以我事先说一下问题的所在看一下图片关于gets()函数一个很纠结的有关问题,具体请进

等下请各位大神看下gets()函数,第一次循环能用,第二次就不行了。。。代码中就有一个...这个问题是在让我无语了很久,DEBUG也没有找出头绪


#include<stdio.h>
#include <stdlib.h>
#include<windows.h>
#include<string.h>

struct fcfs_member
{
char Process_name[10];//进程名
int Arrival_time;//到达时间
int Service_time; //服务时间
int Start_time; //开始执行时间
int Completion_time;//完成时间
int Turnaround_time;//周转时间 
float Weighted_turnover_time;//带权周转时间
};

void main()
{
int system(const char *string);//声明清屏函数

struct fcfs_member FCFS_member[4];

printf("下面为一个实例,如果仅测试程序,可按下面数据进行输入\n");
printf("进程名   到达时间   服务时间   开始执行时间   完成时间\n");
printf("  A         0          1            0             1\n");
printf("  B         1         100           1             1\n");
printf("  C         2          1           101           102\n");
printf("  D         3         100          102           202\n\n");

printf("请输入四组数据!连续输入对应数据以空格分隔\n\n");

//------------------------导入数据,并进行排序-----------------------------
int i, j;
for(i=0; i<4; i++)
{
printf("第%d组\n", i+1);

printf("进程名:");
gets(FCFS_member[i].Process_name);

printf("\n到达时间   服务时间   开始执行时间   完成时间\n");
scanf("%d %d %d %d",    &FCFS_member[i].Arrival_time,
&FCFS_member[i].Service_time,
&FCFS_member[i].Start_time,
&FCFS_member[i].Completion_time);

//计算周转时间和带权周转时间
FCFS_member[i].Turnaround_time = FCFS_member[i].Completion_time - FCFS_member[i].Arrival_time;
FCFS_member[i].Weighted_turnover_time = (float)FCFS_member[i].Turnaround_time / (float)FCFS_member[i].Service_time;


}

int flag = 1;//标记排序,避免多次循环判断,提高效率
for(i=0; i<3 && flag == 1; i++)
{
flag = 0;
for(j=0; j<4-i; j++)
{
if(FCFS_member[j].Arrival_time > FCFS_member[j+1].Arrival_time)
{
char temp_string[10];

//交换进程名
strcpy(temp_string, FCFS_member[j].Process_name);
strcpy(FCFS_member[j].Process_name,
FCFS_member[j+1].Process_name);
strcpy(FCFS_member[j+1].Process_name, temp_string);

//交换到达时间
FCFS_member[j].Arrival_time = FCFS_member[j].Arrival_time ^ FCFS_member[j+1].Arrival_time;
FCFS_member[j+1].Arrival_time = FCFS_member[j+1].Arrival_time ^ FCFS_member[j].Arrival_time;
FCFS_member[j].Arrival_time = FCFS_member[j].Arrival_time ^ FCFS_member[j+1].Arrival_time;

//交换服务时间
FCFS_member[j].Service_time = FCFS_member[j].Service_time ^ FCFS_member[j+1].Service_time;
FCFS_member[j+1].Service_time = FCFS_member[j+1].Service_time ^ FCFS_member[j].Service_time;
FCFS_member[j].Service_time = FCFS_member[j].Service_time ^ FCFS_member[j+1].Service_time;

//交换开始执行时间
FCFS_member[j].Start_time = FCFS_member[j].Start_time ^ FCFS_member[j+1].Start_time;
FCFS_member[j+1].Start_time = FCFS_member[j+1].Start_time ^ FCFS_member[j].Start_time;
FCFS_member[j].Start_time = FCFS_member[j].Start_time ^ FCFS_member[j+1].Start_time;

//交换完成时间
FCFS_member[j].Completion_time = FCFS_member[j].Completion_time ^ FCFS_member[j+1].Completion_time;
FCFS_member[j+1].Completion_time = FCFS_member[j+1].Completion_time ^ FCFS_member[j].Completion_time;
FCFS_member[j].Completion_time = FCFS_member[j].Completion_time ^ FCFS_member[j+1].Completion_time;

//交换周转时间
FCFS_member[j].Turnaround_time = FCFS_member[j].Turnaround_time ^ FCFS_member[j+1].Turnaround_time;
FCFS_member[j+1].Turnaround_time = FCFS_member[j+1].Turnaround_time ^ FCFS_member[j].Turnaround_time;
FCFS_member[j].Turnaround_time = FCFS_member[j].Turnaround_time ^ FCFS_member[j+1].Turnaround_time;

//交换带权周转时间
float temp;
temp = FCFS_member[j].Weighted_turnover_time;
FCFS_member[j].Weighted_turnover_time = FCFS_member[j+1].Weighted_turnover_time;
FCFS_member[j+1].Weighted_turnover_time = temp;
}
}
}
//----------------执行阶段---------------------------------
printf("进程名   到达时间   服务时间   开始执行时间   完成时间   周转时间   带权周转时间\n");


for(i=0; i<4; i++)
{
for(j=0; j<FCFS_member[i].Service_time; j++)
{
printf("%10s %5d %5d", FCFS_member[i].Process_name,
FCFS_member[i].Arrival_time,
j);
Sleep(500);//延迟计数时间

printf("%5d %5d %5d %5.3f\n", FCFS_member[i].Start_time,
  FCFS_member[i].Completion_time,
  FCFS_member[i].Turnaround_time,
  FCFS_member[i].Weighted_turnover_time);
Sleep(500);//延迟计数时间
system("cls"); //清屏
}
}


}

[解决办法]

#include <stdio.h>

void main()
{
char buf[1024];

while (gets(buf))
printf("%s\n", buf);

return 0;
}


输入:
abc
输出:
abc

输入:
hij
输出:
hij

输入:
CTRL+Z
结束

单独把gets()逻辑拿出来,看看自己的gets()代码逻辑有没有问题,如果没有.应该就是其他问题.
[解决办法]
输入缓存没有清空,在用标准输入时,换行是会存在缓冲区的,比如

int nA = 0;
while(1)
{
    printf("请输入一个数组"); 
    scanf("%d",&nA);
    printf("输入的数字是%d", nA);
}

第一次会停止在scanf,第二次就不会,因为第一次缓冲区没有东西,第二次有一个换行符,所以不会停止,windows下可以在每个scanf后面加上fflush(stdin)来清除缓冲区的内容
[解决办法]
正如四楼所言
数组的长度是要设置好的,用gets()函数是有一个缺点的,你输入多少它就接受多少,这样就很容易占用后面的空间,著名的“蠕虫病毒就是因为这个函数导致的”
所以,输入字符串尽量在数组长度之内,也不要忘了给最后的结束标志留一个位置,不然的话,换行符是会留在缓冲区,占据其他数据的位置的
[解决办法]
利用scanf函数从键盘接收一字符(或整数)时,它只读入字符(或整数)本身,而把字符(或整数)后的回车符留在输入缓冲区内;gets函数从标准的输入读取,如果使用gets函数给字符数组输入字符串时,字符数组不能指定长度,因为,只要字符数组的长度小于gets函数读取的行缓存的大小,即使你输入的字符数大于你所规定的字符数组的长度,gets函数也会接收所输入的全部字符,造成字符数组越界。因此,gets是一个不推荐使用的函数。一般对于初学者来说,容易把scanf和gets函数混用,出现一些问题,有下面两种情况:

1、gets在scanf前调用,这种调用一般不会出现什么问题,可以正常输入。

2、scanf在gets前调用,这种情况就会出现问题,当输入完scanf中的变量时,运行到gets函数,则不让输入任何字符,出现此问题的原因是gets函数接收了scanf输入完后的回车符,解决的办法是在scanf和gets中间,用getchar函数接收掉回车符,这样就不会出现任何问题了。但是这个只能解决有一个换行符的问题。
要想解决多个的问题,可以在scanf之后使用下面的代码来做


if(getchar()!='\n')
{
   continue;
}

不过说真的建议别使用gets,不是很安全,而且只适用于玩具程序。
[解决办法]
引用:
引用:C/C++ code1234567891011#include <stdio.h> void main(){    char buf[1024];     while (gets(buf))        printf("%s\n", buf);     return 0;}

输入:
abc
输出:
ab……

这个应该是典型的换行符号被存储在缓存里的问题了吧。
你每次循环结束之前,调用一下getchar()函数,把回车清除掉应该就好了。
[解决办法]
应改为
fgets(FCFS_member[i].Process_name,10,stdin);
if ('\n'==FCFS_member[i].Process_name[strlen(FCFS_member[i].Process_name)-1]) FCFS_member[i].Process_name[strlen(FCFS_member[i].Process_name)-1]=0;

热点排行