首页 > 解决方案 > 我似乎无法弄清楚为什么我的代码中的 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 的值。我似乎无法理解为什么它会这样工作。

标签: c

解决方案


问题 scanf("%d ",&(L->elem[i]));在于createList. 具体来说,当您输入第一个数字时,格式字符串中的尾随空格"%d "会占用回车符,并且您必须键入其他内容scanf才能完成第一次调用。因此,当您认为您正在输入第二个元素时,您实际上仍在为第一个scanf调用提供输入。有关scanf格式字符串中空格的更多详细信息,请参阅此答案。

C如何处理scanf中的尾随空格?

只需删除尾随空格"%d",它就会按您的预期工作。


推荐阅读