0

我正在学习链表,当我使用 scanf 输入字符时,代码编译得很好,但在运行时它不要求输入并跳过 scanf 语句。

#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    struct node *ptr;
};
struct node* allocate();
struct node* create();
void display(struct node*);
int main()
{
    struct node *new;
    new=create();
    display(new);
    return 0;
}
struct node* allocate()
{
    struct node *temp;
    temp=(struct node*)malloc(sizeof(struct node));
    return temp;
}
struct node* create()
{
    struct node *start,*next;
    char ch;
    start=next=allocate();
    printf("Enter data:\n");
    scanf("%d",&start->data);
    perror("store data");
    start->ptr=NULL;
R1: printf("Do you want to enter more data? y or n::    ");
    scanf("%c", &ch); //Check for error here
    if(ch=='y'||ch=='Y')
    {
        while(ch=='y'||ch=='Y')
        {
            next->ptr=allocate();
            next=next->ptr;
            printf("Enter data:\n");
            scanf("%d",&next->data);
            next->ptr=NULL;
            printf("Do you want to enter more data? y or n::    ");
            scanf(" %c",&ch);
        }
    }    
    if(ch=='n'||ch=='N')
    {
        return start;
    }
    else
    {
        printf("Please enter correct option.\n");
        goto R1;
    }
}
void display(struct node* temp)
{
    printf("%d\n",temp->data);
    while(temp->ptr!=NULL)
    {
        temp=temp->ptr;
        printf("%d\n",temp->data);
    }      
}

请参考评论

在这里检查错误

在代码中了解我所指的语句。

  • 现在,如果我在格式说明符之前添加一个空格,即在 scanf 语句中的 %c 之前添加一个空格,那么我的代码运行良好。.

    scanf(" %c",&ch);
    

当我使用 getchar 而不是 scanf 时,我遇到了同样的问题

ch=getchar();

当我在 scanf 语句中的格式说明符之前不使用空格或使用 getchar() 语句运行我的代码时,我的程序不会要求输入。它在 ch 中不存储任何内容。谁能解释一下背后的原因?为什么 scanf 与字符数据类型的行为如此不同?

附加信息:

  • 使用 GCC
  • Linux 内核 3.6.11-4
  • 操作系统 Fedora 16(64 位)
  • 英特尔 i5 处理器。
4

2 回答 2

2

为什么 scanf 对字符数据类型的行为如此不同?

scanf()行为不同,因为类型不同。

使用 %i %u %e %f 之类的数字格式说明符,scanf()会丢弃前导空格。所以“123”和“123”都读作123。

使用 %c,scanf()获取 1 个字节的输入,任何1个字节,并返回它,包括空格和 \0。

使用 %sscanf()就像通过忽略前导空白来扫描数字一样。它会扫描chars直到找到另一个空格。

格式说明符 %[...] 的工作方式与 %s 类似,因为它扫描多个char,但“...”部分说明要查找的内容。它不会折腾前导空格。

于 2013-08-28T22:20:45.613 回答
1
 why does scanf behave so differently with character data types?

那是因为scanf它的行为是这样的,实际上它是一个非常复杂的功能,在必要之前应该尽量避免它。然而,主要原因在于格式字符串中的空格意味着跳过下一个输入项之前的任何空格,除了 %c

因此,scanf("%d%d", &n, &m)的行为与scanf("%d %d", &n, &m). 对于%c,在格式字符串中添加空格字符确实会有所不同。例如,如果%c格式字符串中前面有一个空格,则会scanf()跳到第一个非空白字符。也就是说,该命令scanf("%c", &ch)读取输入中遇到的第一个字符,并scanf(" %c",&ch)读取遇到的第一个非空白字符。

请注意,空格也是一个字符

根据 C11 标准(7.21.6.2 fscanf 函数,第 #8 节

输入空白字符(由 isspace 函数指定)被跳过,除非规范包含[cn说明符

于 2013-08-28T23:37:13.190 回答