2014-01-10 37 views
0

我试图使用得到存储的名称/小短语得到休息的周期基于C

它应该保持39个字符,但在我进入的第一个字符返回到上一个周期。 (我有一个虽然显示主要内容)

它为什么不工作,假设?

char nome[40]; 
printf("\nNome do Equipamento: "); 
gets(nome); 
strcpy(eq[n].nomeEquipamento, nome); 
+4

首先要明白强制性:'gets'是_evil_。甚至没有'goto'有点邪恶。从“永远不要使用它,不管环境如何”这个意义上来说,这是邪恶的。这本质上是一个步行安全漏洞。 既然这样 - 请告诉我们主要功能的其余部分,不能告诉任何事情。 – Cubic

+0

C语言中不再有一个函数叫做gets,它在2年前被删除。 – Lundin

+0

@Pedro请发布完整的代码。 – Lundin

回答

1

在您所提供的链接,还有一个scanf呼叫前gets

printf("\nCodigo do Equipamento: ");  
scanf("%d",&codigo);  
eq[n].codDipositivo=codigo; 
printf("\nNome do Equipamento: ");    
gets(nome); 

scanf电话留下\n字符按输入键后。这\n字符被读取gets,这就是为什么你面临这个问题。
要使用此\n,请在scanf之后使用getchar表格;

printf("\nCodigo do Equipamento: ");  
scanf("%d",&codigo); 
getchar();  // To comsume '\n'  
eq[n].codDipositivo=codigo; 
printf("\nNome do Equipamento: ");    
gets(nome); 

现在约为gets;高兴地坐在那邪恶gets现在是一个历史。改为使用fgets
也不要使用strcpy,而应该使用strncpy(在使用之前,请仔细阅读prrovided链接)。

+0

非常感谢你!我添加了fflush(stdin);在scanf和fgets之前,它现在可以工作了! – Pedro

+1

@Pedro;不要使用'fflush(stdin)'。如果您不在MS-DOS上,它会调用**未定义的行为**。 – haccks

+1

在提示使用它之前,你应该总是提到'strncpy'中的缺陷。否则,你只能将一个漏洞切换到另一个漏洞。 – user694733