我是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;
}
答案 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"
}