如何防止在输出区域打印打印回车键(\n)

how to prevent print enter key (\n) being print in output area

我的打印输出有问题,每次打印“12”时都会向下输入,我不知道是什么问题,我试过单独打印但没有成功(下面的代码)

问题

棒球运动员的安打率等于安打数除以 根据官方的 at-bats 数量。在计算官方击球、保送、牺牲时, 被球场击中的次数不计算在内。编写程序 它采用包含球员号码和击球记录的输入文件。前往 板在击球记录中的编码如下:H—击球,O—出局,W—保送, S——牺牲,P——击球。该程序应该为每个玩家输出 输入数据后跟安打率。 (提示:每条击球记录都是 后跟一个换行符。)

示例输入文件:

12 呜呜呜呜呜呜

4 呜呜呜呜呜呜

7 WPOHOOHWOHHOWOO

对应输出:

玩家 12 的记录:HOOOWSHHOOHPWWHO

选手 12 的安打率:0.455

玩家 4 的记录:OSOHHHWWOHOHOOO

选手 4 的安打率:0.417

选手 7 的记录:WPOHOOHWOHHOWOO

选手 7 的安打率:0.364

代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main() {
    char str[1000];
    int count = 0;
    int count2 = 0;
    char ch = 'H';
    char ch2 = 'O';
    double top = 0;
    double bottom = 0;
    double avg;
    char PN[1000];

    printf("Enter player's number:");
    fgets(PN, sizeof(PN), stdin);

    printf("Enter a record: ");
    fgets(str, sizeof(str), stdin);

    for (int i = 0; str[i] != '[=10=]'; ++i) { //counts H//
        if (ch == str[i])
            ++count;
        top = count;
    }

    for (int i = 0; str[i] != '[=10=]'; ++i) { //counts O//
        if (ch2 == str[i])
            ++count2;
        bottom = count2;
    }

    avg = top / (top + bottom); // H / ( H + O ) //


    printf("Player %s's record: %s", PN, str);

    printf("Player %s's batting average: %.3lf", PN, avg);


    return 0;
}

我的代码输出

input
Enter player's number:12
Enter a record: HOOOWSHHOOHPWWHO

output
Player 12
's record: HOOOWSHHOOHPWWHO
Player 12
's batting average: 0.455

应该是

Player 12's record: HOOOWSHHOOHPWWHO
Player 12's batting average: 0.455

fgets() reads and stores the trailing newline in the buffer. One way of getting rid of that is to use strcspn(),喜欢

PN[strcspn(PN, "\n")] = 0;

快速解决方案:只添加 一个 行代码到你的:

printf("Enter player's number:");

// ------------    note that <string.h> needs to be included
PN[strlen(PN)-1]='[=10=]';   //   <------here
// ------------

fgets(PN, sizeof(PN), stdin);

更多信息:

对于函数 fgets,根据 man7 的定义:

The fgets() function shall read bytes from stream into the array pointed to by s until n-1 bytes are read, or a is read and transferred to s, or an end-of-file condition is encountered. A null byte shall be written immediately after the last byte read into the array

fgets之后,数据从stdio流缓冲区复制到PN缓冲区,大小为sizeof(PN)(即1000),得到的PN将是这样的:

{ '1' , '2' , '\n' , '[=11=]' , '[=11=]' , '[=11=]' , ...... }

之后,当你调用printf时,PN的一些字符将被复制到STDOUT(即shell),它们是这样的:

{ '1' , '2' , '\n' , '[=12=]' }     // note that '[=12=]' is just an terminator, and will not be displayed on screen. 

,其中包含的字符比我们需要的多一个字符,该字符是一个换行符 \n.

调用printf("Player %s's record: %s", PN, str);时,换行符\n会被当做控制符,效果为[=22] =]键,这就是为什么你的程序在打印“12”时总是输入向下的原因。