C 为什么它忽略了第二个字符
我有以下代码:C 为什么它忽略了第二个字符,c,char,C,Char,我有以下代码: #include <stdio.h> #include <ctype.h> int main() { char x; printf("Program shows your name and check if the first letter is capital"); while (scanf_s("%c", &x) !=1 || getchar() !='\n') { if (islower(x
#include <stdio.h>
#include <ctype.h>
int main()
{
char x;
printf("Program shows your name and check if the first letter is capital");
while (scanf_s("%c", &x) !=1 || getchar() !='\n')
{
if (islower(x))
{
printf("Name begins with a capital letter\n");
while (getchar() != '\n')
;
}
else
{
printf("%c", x);
}
break;
}
while ((x = getchar()) != EOF)
{
printf("%c", x);
}
return 0;
}
#包括
#包括
int main()
{
字符x;
printf(“程序显示您的姓名并检查第一个字母是否大写”);
而(scanf_s(“%c”、&x)!=1 | | getchar()!=“\n”)
{
if(岛下(x))
{
printf(“名称以大写字母\n开头”);
而(getchar()!='\n')
;
}
其他的
{
printf(“%c”,x);
}
打破
}
而((x=getchar())!=EOF)
{
printf(“%c”,x);
}
返回0;
}
例如:
当我输入“Matthew”时,结果是“Mtthew”。怎么了?我不知道。
我试图在第一个“while”中改变几乎所有的事情,但我认为问题并不存在。有什么想法吗?函数getChar()从输入流中删除一个字符,使其不再存在。通过在条件语句中使用它,它是:
- 从流中获取角色(又称:删除它)
- 比较一下,最后
- 丢弃它(未将其保存在某处)
- 从流中获取角色(又称:删除它)
- 比较一下,最后
- 丢弃它(未将其保存在某处)
如果重构你的代码来考虑这一点,那么我相信你的神秘字符会返回:-)
< p>将<<代码>改为 > while ((x = getchar()) != EOF && x != '\n')
编辑:并将
char x
更改为int x
,因为EOF
不能保证由char
表示
while ((x = getchar()) != EOF && x != '\n')
编辑:并将
char x
更改为int x
,因为EOF
不能保证由char
表示。在进行以下更改时,您的程序工作时没有跳过字符:(请参阅行中的注释)
但是@J.Murray在回答中关于getchar()
吃字符的评论是有效的。所以,尽管你的程序对我有用,但有些输入序列是不可用的
注意:使用
int
而不是char
的原因是getchar()
可以返回EOF
,它==-1。char
不能包含-1。在进行以下更改时,您的程序运行时不会跳过字符:(请参阅行中的注释)
但是@J.Murray在回答中关于getchar()
吃字符的评论是有效的。所以,尽管你的程序对我有用,但有些输入序列是不可用的
注意:使用
int
而不是char
的原因是getchar()
可以返回EOF
,它==-1。char
不能包含-1。肯定不正确地使用了scanf\u s(“%c”和&x)
fscanf_s函数与fscanf等价,不同之处在于c、s和[conversion说明符应用于一对参数(除非赋值抑制由*表示)。其中第一个参数与fscanf相同。该参数在参数列表中紧跟第二个参数,其类型为rsize_t
,并给出该对的第一个参数指向的数组中的元素数。(C111dr§K.3.5.3.2 6)
可能还存在其他问题。肯定不正确地使用了
scanf\u s(“%c”和&x)
fscanf_s函数与fscanf等价,不同之处在于c、s和[conversion说明符应用于一对参数(除非赋值抑制由*表示)。其中第一个参数与fscanf相同。该参数在参数列表中紧跟第二个参数,其类型为rsize_t
,并给出该对的第一个参数指向的数组中的元素数。(C111dr§K.3.5.3.2 6)
其他问题可能存在。
3为该函数的循环,也许您应该考虑重写它,如果将它与EOF进行比较,则应该声明X为<代码> INT/C>。<代码> >不确定,但我认为在其他函数的循环中,StREST必须在BoeBase3中,而在该函数的循环中,也许您应该考虑重写它,如果将它与EOF进行比较,则应该声明X为<代码> INT/C>。。不确定,但我认为else之后的break必须在else块中scanf_s("%c", &x, (rsize_t)1)