c - 我似乎无法弄清楚为什么我的代码中的 scanf 行为如此奇怪
问题描述
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
# define ListSize 100
typedef int DataType;
typedef struct {
DataType elem[ListSize];
int length;
}SqList;
SqList * createList(int n)
{
SqList *L;
int i;
L=(SqList *)malloc(sizeof(SqList));
L->length=0;
printf("Input the elements:\n");
for (i=0;i<n;i++)
{
scanf("%d ",&(L->elem[i]));
L->length++;
}
return L;
}
void display(SqList *L)
{
int i;
for (i = 0; i < L->length; i++)
{
printf("%d\t" , L->elem[i]);
printf("\n");
}
}
int insert(SqList *L, int mark, DataType x)//Insert element x into list in the position mark
{
int i=0;
if(mark>L->length||mark<0)
return 0;
else
{
for (i=L->length-1;i>=mark;i--)
L->elem[i+1] = L->elem[i]; //move elements
L->elem[i+1]=x; //insert
L->length++;
return 1;
}
}
void main()
{
int num;
int in,loc;
SqList *List;
printf("Input the number of elements:");
scanf("%d",&num);
List=createList(num);
printf("\n The list is: \n");
display(List);
printf("Please input location and element to insert into the list: \n");
scanf("%d %d",&loc,&in);
insert(List,loc,in);
display(List);
}
所以我的任务是创建一个顺序列表并将一个元素插入到列表中用户键入的位置。我想出了上面的代码,但我的 scanf 函数表现得很奇怪。它要求我在列表中输入我想要的元素数量,但由于某种原因,它需要多输入一个。该输入实际上是变量 loc 的值。我似乎无法理解为什么它会这样工作。
解决方案
问题
scanf("%d ",&(L->elem[i]));
在于createList
. 具体来说,当您输入第一个数字时,格式字符串中的尾随空格"%d "
会占用回车符,并且您必须键入其他内容scanf
才能完成第一次调用。因此,当您认为您正在输入第二个元素时,您实际上仍在为第一个scanf
调用提供输入。有关scanf
格式字符串中空格的更多详细信息,请参阅此答案。
只需删除尾随空格"%d"
,它就会按您的预期工作。
推荐阅读
- android - 将上下文作为类参数传递是否可以避免泄漏?
- google-analytics - 向 Google Analytics(分析)发送事件不起作用
- ios - 何时使用本机 CallKit UI,何时使用您自己的自定义电话 UI?
- python - 错误:没有为 pandas 找到匹配的分布 - “pip install pandas”
- c# - 从一个句子中提取多个id到一个变量
- angular - 由后端提供的带有角度的 Spring 安全配置
- java - 如何使用 Spring Boot 和注释在测试类中正确注入 Bean
- asp.net - 在 aspx 页面中显示 MVC 视图
- visual-studio-code - 为 JSONSchema 附加属性定义 defaultSnippets
- ios - applicationWillTerminate 与 applicationWillResignActive 与 applicationDidEnterBackground?它们究竟是什么时候触发的?