输入一个字符打印错误,但在c中输入0时不打印
Inputting a character to print error, but not when 0 is input in c
我希望能够输入一个字符,程序会 printf("Invalid entry. \nPlease try again:\n")
但我还需要能够输入 0,我不明白为什么它不起作用,我设置的方式起来了。
for (i=0; i<*r; i++)
{
printf("Please enter the number of 1's in row %d :\n", (i+1));
scanf("%s", &str);
if(atoi(str)!=sizeof(char))
{
while(atoi(str)==0)
{
printf("Invalid entry. \nPlease try again:\n");
scanf("%s",str);
}
f = atoi(str);
}
else
f=0;
if (f>0)
{
printf("Please enter column location of the 1's in row %d : \n", (i+1));
for (j=0; j<f; j++)
{
scanf("%d", &g);
p[i][g-1]= 1;
}
}
}
我不明白为什么你不能得到一个整数作为你的输入,然后你就可以摆脱将字符串转换为整数。
int num;
printf("Please enter the number of 1's in row %d :\n", (i+1));
scanf("%d", &num);
while(!num)
{
printf("Invalid entry. \nPlease try again:\n");
scanf("%d", &num);
}
atoi()
如果字符串不是以有效的十进制数字开头,则 return 始终为零,因此不能用于区分无效输入和有效的“0”输入。
改为使用带有“%d”格式说明符的 scanf() 并检查其 return 值:
int i = 0 ;
do
{
int check = scanf( "%d", &i ) ;
while( getchar() != '\n' ) ; // flush until end of line
if( check == 0 )
{
printf( "Invalid entry. \nPlease try again:\n");
}
} while( check == 0 ) ;
// Now work with the valid input integer value in i ...
考虑将代码放在一个函数中,这样您就不必自己重复:
int getIntegerInput()
{
int i = 0 ;
do
{
int check = scanf( "%d", &i ) ;
while( getchar() != '\n' ) ; // flush until end of line
if( check == 0 )
{
printf( "Invalid entry. \nPlease try again:\n");
}
} while( check == 0 ) ;
return i ;
}
您发现 atoi()
不好的原因了。 atoi()
不会进行任何错误报告,例如整数溢出、无效输入等,并且无法区分有效 0
输入和转换失败。
使用 strto*l()
函数进行转换,因为它们可以检测转换失败。您的输入读数可以按如下方式完成:
#include <stdio.h>
#include <stdlib.h>
#include<limits.h>
#include<errno.h>
....
for(;;) {
scanf("%s", str);
errno=0;
long f = strtol(str, &endp, 0);
if (endp == str || *endp != 0 ||
(errno == ERANGE && (f == LONG_MAX || f == LONG_MIN)) ||
(errno != 0 && f == 0)) {
printf("Invalid entry. \nPlease try again:\n");
}
else break;
}
我希望能够输入一个字符,程序会 printf("Invalid entry. \nPlease try again:\n")
但我还需要能够输入 0,我不明白为什么它不起作用,我设置的方式起来了。
for (i=0; i<*r; i++)
{
printf("Please enter the number of 1's in row %d :\n", (i+1));
scanf("%s", &str);
if(atoi(str)!=sizeof(char))
{
while(atoi(str)==0)
{
printf("Invalid entry. \nPlease try again:\n");
scanf("%s",str);
}
f = atoi(str);
}
else
f=0;
if (f>0)
{
printf("Please enter column location of the 1's in row %d : \n", (i+1));
for (j=0; j<f; j++)
{
scanf("%d", &g);
p[i][g-1]= 1;
}
}
}
我不明白为什么你不能得到一个整数作为你的输入,然后你就可以摆脱将字符串转换为整数。
int num;
printf("Please enter the number of 1's in row %d :\n", (i+1));
scanf("%d", &num);
while(!num)
{
printf("Invalid entry. \nPlease try again:\n");
scanf("%d", &num);
}
atoi()
如果字符串不是以有效的十进制数字开头,则 return 始终为零,因此不能用于区分无效输入和有效的“0”输入。
改为使用带有“%d”格式说明符的 scanf() 并检查其 return 值:
int i = 0 ;
do
{
int check = scanf( "%d", &i ) ;
while( getchar() != '\n' ) ; // flush until end of line
if( check == 0 )
{
printf( "Invalid entry. \nPlease try again:\n");
}
} while( check == 0 ) ;
// Now work with the valid input integer value in i ...
考虑将代码放在一个函数中,这样您就不必自己重复:
int getIntegerInput()
{
int i = 0 ;
do
{
int check = scanf( "%d", &i ) ;
while( getchar() != '\n' ) ; // flush until end of line
if( check == 0 )
{
printf( "Invalid entry. \nPlease try again:\n");
}
} while( check == 0 ) ;
return i ;
}
您发现 atoi()
不好的原因了。 atoi()
不会进行任何错误报告,例如整数溢出、无效输入等,并且无法区分有效 0
输入和转换失败。
使用 strto*l()
函数进行转换,因为它们可以检测转换失败。您的输入读数可以按如下方式完成:
#include <stdio.h>
#include <stdlib.h>
#include<limits.h>
#include<errno.h>
....
for(;;) {
scanf("%s", str);
errno=0;
long f = strtol(str, &endp, 0);
if (endp == str || *endp != 0 ||
(errno == ERANGE && (f == LONG_MAX || f == LONG_MIN)) ||
(errno != 0 && f == 0)) {
printf("Invalid entry. \nPlease try again:\n");
}
else break;
}