为什么它会忽略第二个字符

时间:2015-12-08 17:47:21

标签: 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))
        {
            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;
}

例如: 当我输入&#34;马修&#34;结果是&#34; Mtthew&#34;。怎么了?我没有线索。 我试图改变几乎所有的东西#34;而#34;但我认为问题不在那里。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

函数getChar()从输入流中删除一个字符,使其不再出现。通过在条件语句中使用它,它是:

  • 从流中获取角色(a.k.a:删除它)
  • 比较,最后
  • 丢弃它(未将其保存在某处)

如果你重构你的代码来考虑这个,那么我相信你的神秘人物将会回归: - )

答案 1 :(得分:0)

将第一个while更改为

    while ((x = getchar()) != EOF && x != '\n')

编辑:并将char x更改为int x,因为EOF并不能保证char能够代表。

答案 2 :(得分:0)

当进行以下更改时,您的程序无需跳过字符即可运行:(参阅在线评论)

int x;  //change to int for use with getchar()
printf("Program shows your name and check if the first letter is capital");
while (scanf("%d", &x) !=1 ||  getchar() !='\n')
               ^ //changed to d for int  

但@J.Murray关于getchar()吃一个角色的回答是有效的。因此,虽然您的程序适合我,但有一些输入序列不会。

注意 :使用int而不是char的原因是getchar()可以返回EOF ,其中== -1。 char不能包含-1。

答案 3 :(得分:0)

当然错误地使用<div class="header"> <div class="navbar"> <a href="" class="in" style="display: inline-block;"> <svg class="navinstagram" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 155.2 144" style="enable-background:new 0 0 155.2 144;" xml:space="preserve"> <path d="M42.7,122.7H21.3V54h21.4V122.7z M32,44.6c-6.8,0-12.4-5.6-12.4-12.4c0-6.8,5.5-12.4,12.4-12.4 c6.8,0,12.4,5.5,12.4,12.4C44.4,39,38.9,44.6,32,44.6z M122.7,122.7h-21.3V89.3c0-8-0.1-18.2-11.1-18.2c-11.1,0-12.8,8.7-12.8,17.6 v34H56.1V54h20.5v9.4h0.3c2.8-5.4,9.8-11.1,20.2-11.1c21.6,0,25.6,14.2,25.6,32.7V122.7z"/> <g> <path style="fill:#FFFFFF;" d="M151.9,120c0.7-0.1,1-0.5,1-1.1c0-0.8-0.5-1.1-1.4-1.1H150v4h0.6V120h0.7l0,0l1.1,1.7h0.6L151.9,120 L151.9,120z M151.3,119.6h-0.7v-1.4h0.9c0.4,0,0.9,0.1,0.9,0.6C152.4,119.5,151.9,119.6,151.3,119.6z"/> <path style="fill:#FFFFFF;" d="M151.3,116c-2.1,0-3.8,1.7-3.8,3.8c0,2.1,1.7,3.8,3.8,3.8c2.1,0,3.8-1.7,3.8-3.8 C155.2,117.6,153.5,116,151.3,116z M151.3,123.1c-1.8,0-3.3-1.4-3.3-3.3c0-1.9,1.4-3.3,3.3-3.3c1.8,0,3.3,1.4,3.3,3.3 C154.6,121.7,153.2,123.1,151.3,123.1z"/> </g> </svg> </a> <a href="" class="logo logocolorchng" style="display: inline-block;">Logo </a> <a id="toggle-menu"> <div> <span class="top"></span> <span class="middle"></span> <span class="bottom"></span> </div> </a> </div> <div class="nav"> <div class="navigation"> <ul> <li class="navlist"><a href="" style="display: inline-block; width:100%;">Home</a></li> <li class="navlist"><a href="#panel2" style="display: inline-block; width:100%;">Work</a></li> <li class="navlist"><a href="#wrapper" style="display: inline-block; width:100%;">Contact</a></li> </ul> </div>

  

fscanf_s函数等效于fscanf,除了c,s和[转换说明符适用于一对参数(除非赋值抑制由*表示)。这些参数中的第一个与fscanf相同。该参数紧接在参数列表中由第二个参数跟随,该参数具有类型-1 (root) --2 (ctrl) ---3 mytab ----4 ($$transcluded = true) ------5 mypane --------6 ($$transcluded = true) 并且给出该对的第一个参数指向的数组中的元素数。 (C111dr§K.3.5.3.26)

pane

可能存在其他问题。