fgets()麻烦。获取if / else语句的用户输入时

时间:2018-01-18 21:26:35

标签: c

我是c编程的新手。当我接受用户输入时,让我们说他们放1,它跳过无效。这只发生在我尝试使用fgets()时,当我使用scanf它工作正常。任何人都可以帮助我,并可能解释为什么会这样,所以我可以试着弄清楚如何解决它?

int main()
{
char choice [10];
printf ("Select an option: \n");
printf ("1. String -> numerical values \n");
printf ("2. Decimal values -> String \n");
printf ("3. Exit \n");
printf ("Enter a choice: \n"); 
fgets (choice, 10, stdin);

if (choice[10] == '1')
{
printf ("Please enter a string: ");
}

else if (choice[10] == '2')
{
    printf ("Convert ASCII decimal values to string (press ENTER after each integer). \n");
    printf ("Press ENTER twice to finish");

}

else if (choice[10] == '3')
{
    exit(0);
}
else 
{
    printf ("Invalid option \n");
}

return 0;
}

1 个答案:

答案 0 :(得分:2)

if的问题在于您正在尝试访问内存 绑定,对于维度为10的数组,您只能从0 - 9访问任何内容 beyound产生不确定的行为。

char choice [10];
...
if(choice[0] == '1')
{
    ...
}

在大多数编程语言中,你从0开始计数。所以如果你声明一个 维数 n 的数组,第一个元素位于第0位,最后一个元素位于 职位 n-1

如果您想要比较字符串,则应使用strcmp。另请注意 当缓冲区中有足够的空间时,fgets会保存换行符。

  

man fgets

#include <stdio.h>

char *fgets(char *s, int size, FILE *stream);
     

<强>描述

     

fgets()中读取最多一个来自流size个字符,并将它们存储到s指向的缓冲区中。   读数在EOF或换行符后停止。 如果读取换行符,则将其存储到缓冲区。   终止空字节('\0')存储在缓冲区中的最后一个字符之后。

比较您案例中的字符串:

if(strcmp(choice, "1\n") == 0)
{
    // string is equal to "1\n"
}