如果用户按 Enter 键而不输入任何浮点值,我需要程序退出 while 循环。
printf("Enter scores\n");
float scores[10];
int n=0;
while (n < 10){
scanf("%f", &scores[n]);
n++;
if (THE USER PRESSES ENTER WITHOUT ENTERING ANYTHING)
break;
}
您可以使用
fgets()
通过换行符将一行输入读取到缓冲区中,然后使用 sscanf()
解析缓冲区的内容。使用 scanf()
的问题是大多数转换说明符,特别是 %f
转换说明符,会跳过前导空格,包括换行符。因此,如果您尝试为 scanf()
提供一个空行,该函数将继续等待输入,直到您输入非空白字符。
下面的代码使这种技术适应您的代码。变量
n
已更改为 size_t
类型变量,因为这是保证能够保存任何数组索引的无符号类型。此外,请注意 fgets()
和 sscanf()
都返回应检查的值。如果出现错误,fgets()
函数将返回空指针,如果发生这种情况,下面的代码将打印一条错误消息并退出。 sscanf()
函数返回成功转换的次数,该值可用于确保输入符合预期。当用户输入空行或没有前导浮点值的行(前导空白即可)时,将返回零,并转义输入循环。
我添加了一些代码来显示输入到数组中的值。
#include <stdio.h>
#include <stdlib.h> // for exit()
int main(void)
{
float scores[10];
char buffer[100];
size_t n = 0;
printf("Enter scores\n");
while (n < 10){
if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
fprintf(stderr, "Error in fgets()\n");
exit(EXIT_FAILURE);
}
if (sscanf(buffer, "%f", &scores[n]) == 1) {
++n;
} else {
break;
}
}
for (size_t i = 0; i < n; i++) {
printf("scores[%zu] = %f\n", i, scores[i]);
}
return 0;
}
交互示例:
Enter scores
3.8
3.6
2.9
3.4
scores[0] = 3.800000
scores[1] = 3.600000
scores[2] = 2.900000
scores[3] = 3.400000
将用户文本的输入与解析分开。
将用户输入的line读取为字符串;
char buffer[80];
if (fgets(buffer, sizeof buffer, stdin) == NULL) Handle_EOF();
现在,使用
sscanf()
、strtod()
等解析字符串
if (sscanf(buffer, "%f", &scores[n]) == 1) Handle_Successful_Float_Input(scores[n]);
else if (buffer[0] == '\n') Handle_Empty_Line();
else Handle_Everything_Else(buffer);
fgets
是更好的路线,但如果必须使用scanf,可以通过扫描字符来检测换行符。如果该字符不是换行符,请将其在输入中替换为 ungetc
,然后扫描浮点数。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SIZE 10
int main ( void) {
char i = '\0';
int n = 0;
int result = 0;
float scores[SIZE] = { 0.0f};
printf ( "enter scores\n");
while ( n < SIZE && ( scanf("%c",&i) == 1)) {//scan a character
if ( i == '\n') {
break;//newline so leave loop
}
else {
ungetc ( i, stdin);//replace the character in input stream
}
if ( ( result = scanf ( "%f", &scores[n])) == 1) {//scan a float
printf ( " score[%d] entered as %f\n", n, scores[n]);
n++;
}
if ( result == 0) {
printf ( "please enter a number\n");//could not scan the input as a float
}
while ( ( result = getchar ( )) != '\n') {//clean the input stream
if ( result == EOF) {
fprintf ( stderr, "problem EOF\n");
return 1;
}
}
printf ( "enter score[%d]\n", n);
}
return 0;
}
我想。你想检查一个整数是否被赋值? 实际上,您必须初始化变量,否则它将包含该内存位置发生的任何情况,除非将其声明为全局变量。如果您没有收到,请检查 这可能会帮助您解决问题
我们知道,如果没有从输入中获取任何定义类型,则 scanf 将返回负值。
所以:
printf("Enter scores\n”);
float scores[10];
int n=0;
while (n<10){
if(scanf("%f\n", &scores[n]) < 0) printf("Error! Error!");
n++;
}