按下回车时停止获取用户输入(C语言)
Stop getting user inputs when enter is pressed (C language)
我是编程的超级新手,我遇到了一个问题,我应该编写一个 C 程序让用户输入一些数字并对输入的元素进行排序并找到它的中值。一旦用户按下回车键,它就应该停止获取输入。
这是我的代码和 idk 出错的地方(顺便说一句,很抱歉问了这么简单的问题)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int i = 0;
int j,k,m,num;
int arr[20];
while(i<20 )
{
printf("Enter a number: ");
scanf("%d",&num);
if(num == '\n') break;
arr[i] = num;
i++;
}
n = sizeof(arr)/sizeof(arr[0]);
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(arr[i] < arr[j])
{
k = arr[i];
arr[i] = arr[j];
arr[j] = k;
}
}
}
if(n%2 != 0)
{
printf("The median is %d", arr[n/2] ) ;
}
else printf("The median is %.2f", arr[(n-1)/2] + arr[n/2]/2.0);
return 0;
}
如果要停在空行,不能使用scanf
。原因是 scanf("%d", ...)
在等待用户输入数字时会跳过用户输入的所有空白字符。这里的“whitespace”包括换行符'\n'
。因此,用户无法通过按 Enter 来创建 scanf
return - 只有文件结尾 (Ctrl+D on linux) 或虚假输入(非数字)将使 scanf
return.
所以你必须用组合 fgets
+sscanf
替换 scanf
。考虑以下代码:
while (i < 20)
{
int num;
char str[15];
printf("Enter a number: ");
if (!fgets(str, sizeof str, stdin))
break;
if (sscanf(str, "%d", &num) != 1)
break;
arr[i] = num;
i++;
}
它使用fgets
输入一行输入,sscanf
解析该行。如果行中没有任何内容,sscanf
将失败(it returns 1 for success;任何其他失败值)。
备注:
- 如果输入太长,它会被分成两行,这会让用户感到惊讶
- 如果用户在一行中输入多个数字,多余的数字将被忽略
fgets
的 return 值的条件也在文件末尾终止用户输入;如果您通过从文件 重定向来为您的程序提供输入,这很好
可以逐个字符地处理输入,直到存储了 20 个整数或找到换行符。
读取数字时,将它们累加成一个值,检查溢出。
读取空格或其他字符后,将值存储在数组中。
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
int main ( void) {
int ch = 0;
int value = 0;
int sign = 1;
int digits = 0;
int arr[20] = { 0};
int n = 0;
int i = 0;
int j = 0;
int k = 0;
while ( n < 20) {
while ( EOF != ( ch = fgetc ( stdin))) {//read a character
if ( isdigit ( ( unsigned char)ch)) {
ch -= '0';//character to int as '1' to 1
digits = 1;
if ( 1 == sign) {
if ( value < ( INT_MAX / 10) - ch) {
value *= 10;
value += ch;
}
else {
printf ( "overflow! reset to + and zero\n");
value = 0;
sign = 1;
digits = 0;
}
}
if ( -1 == sign) {
if ( value > ( INT_MIN / 10) + ch) {
value *= 10;
value -= ch;
}
else {
printf ( "overflow! reset to + and zero\n");
value = 0;
sign = 1;
digits = 0;
}
}
}
else if ( '-' == ch || '+' == ch) {
if ( digits) {
printf ( "invalid sign! reset to + and zero\n");
value = 0;
sign = 1;
digits = 0;
}
else {
sign = ( '-' == ch) ? -1 : 1;
}
}
else if ( digits) {
arr[n] = value;
value = 0;//reset to zero
sign = 1;//reset to +
++n;
digits = 0;
}
if ( '\n' == ch) {
break;
}
}
if ( '\n' == ch || EOF == ch) {
break;
}
}
for ( i = 0; i < n; i++) {
for ( j = i + 1; j < n; j++) {
if ( arr[i] < arr[j]) {
k = arr[i];
arr[i] = arr[j];
arr[j] = k;
}
}
}
for ( i = 0; i < n; i++) {
printf ( "arr[%d] = %d\n", i, arr[i]);
}
if ( n % 2 != 0) {
printf ( "The median is %d\n", arr[n/2]);
}
else {
printf ( "The median is %.2f\n", ( arr[( n - 1) / 2] + arr[n / 2] ) /2.0);
}
return 0;
}
输入输出:
9 1 82 0 3
arr[0] = 82
arr[1] = 9
arr[2] = 3
arr[3] = 1
arr[4] = 0
The median is 3
我是编程的超级新手,我遇到了一个问题,我应该编写一个 C 程序让用户输入一些数字并对输入的元素进行排序并找到它的中值。一旦用户按下回车键,它就应该停止获取输入。 这是我的代码和 idk 出错的地方(顺便说一句,很抱歉问了这么简单的问题)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int i = 0;
int j,k,m,num;
int arr[20];
while(i<20 )
{
printf("Enter a number: ");
scanf("%d",&num);
if(num == '\n') break;
arr[i] = num;
i++;
}
n = sizeof(arr)/sizeof(arr[0]);
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(arr[i] < arr[j])
{
k = arr[i];
arr[i] = arr[j];
arr[j] = k;
}
}
}
if(n%2 != 0)
{
printf("The median is %d", arr[n/2] ) ;
}
else printf("The median is %.2f", arr[(n-1)/2] + arr[n/2]/2.0);
return 0;
}
如果要停在空行,不能使用scanf
。原因是 scanf("%d", ...)
在等待用户输入数字时会跳过用户输入的所有空白字符。这里的“whitespace”包括换行符'\n'
。因此,用户无法通过按 Enter 来创建 scanf
return - 只有文件结尾 (Ctrl+D on linux) 或虚假输入(非数字)将使 scanf
return.
所以你必须用组合 fgets
+sscanf
替换 scanf
。考虑以下代码:
while (i < 20)
{
int num;
char str[15];
printf("Enter a number: ");
if (!fgets(str, sizeof str, stdin))
break;
if (sscanf(str, "%d", &num) != 1)
break;
arr[i] = num;
i++;
}
它使用fgets
输入一行输入,sscanf
解析该行。如果行中没有任何内容,sscanf
将失败(it returns 1 for success;任何其他失败值)。
备注:
- 如果输入太长,它会被分成两行,这会让用户感到惊讶
- 如果用户在一行中输入多个数字,多余的数字将被忽略
fgets
的 return 值的条件也在文件末尾终止用户输入;如果您通过从文件 重定向来为您的程序提供输入,这很好
可以逐个字符地处理输入,直到存储了 20 个整数或找到换行符。
读取数字时,将它们累加成一个值,检查溢出。
读取空格或其他字符后,将值存储在数组中。
#include <stdio.h>
#include <ctype.h>
#include <limits.h>
int main ( void) {
int ch = 0;
int value = 0;
int sign = 1;
int digits = 0;
int arr[20] = { 0};
int n = 0;
int i = 0;
int j = 0;
int k = 0;
while ( n < 20) {
while ( EOF != ( ch = fgetc ( stdin))) {//read a character
if ( isdigit ( ( unsigned char)ch)) {
ch -= '0';//character to int as '1' to 1
digits = 1;
if ( 1 == sign) {
if ( value < ( INT_MAX / 10) - ch) {
value *= 10;
value += ch;
}
else {
printf ( "overflow! reset to + and zero\n");
value = 0;
sign = 1;
digits = 0;
}
}
if ( -1 == sign) {
if ( value > ( INT_MIN / 10) + ch) {
value *= 10;
value -= ch;
}
else {
printf ( "overflow! reset to + and zero\n");
value = 0;
sign = 1;
digits = 0;
}
}
}
else if ( '-' == ch || '+' == ch) {
if ( digits) {
printf ( "invalid sign! reset to + and zero\n");
value = 0;
sign = 1;
digits = 0;
}
else {
sign = ( '-' == ch) ? -1 : 1;
}
}
else if ( digits) {
arr[n] = value;
value = 0;//reset to zero
sign = 1;//reset to +
++n;
digits = 0;
}
if ( '\n' == ch) {
break;
}
}
if ( '\n' == ch || EOF == ch) {
break;
}
}
for ( i = 0; i < n; i++) {
for ( j = i + 1; j < n; j++) {
if ( arr[i] < arr[j]) {
k = arr[i];
arr[i] = arr[j];
arr[j] = k;
}
}
}
for ( i = 0; i < n; i++) {
printf ( "arr[%d] = %d\n", i, arr[i]);
}
if ( n % 2 != 0) {
printf ( "The median is %d\n", arr[n/2]);
}
else {
printf ( "The median is %.2f\n", ( arr[( n - 1) / 2] + arr[n / 2] ) /2.0);
}
return 0;
}
输入输出:
9 1 82 0 3
arr[0] = 82
arr[1] = 9
arr[2] = 3
arr[3] = 1
arr[4] = 0
The median is 3