如何防止在输出区域打印打印回车键(\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”时总是输入向下的原因。
我的打印输出有问题,每次打印“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”时总是输入向下的原因。