Kri*_*ris 2 c arrays input scanf
我对C有点陌生,输入的输入确实使我感到困惑。我正在尝试初始化大小为4的数组,但有时用户会输入3的有效输入。在Java中,我可以检查输入的长度并添加条件,但不确定在C中如何工作。
main(void){
char str[N];
int i;
for(i = 0; i < N; i++){
scanf("%c", &str[i]);
}
for(i = 0; i < N; i++){
printf("%c\n", str[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我输入4或更多,它可以正常工作。如果我输入3,它将中断。我希望它能处理3个或4个字符。
实际上,问题的根源是:我试图在C中找到一种方法来读取24小时制的时间,并将其添加到24小时制的时间中。我应该以一种完全不同的方式来处理吗?
谢谢,
简短的答案是:您不能。
scanf()因此,如果要读取字符串(%s),使用该方法特别危险。如果用户输入的内容超出缓冲区可以容纳的范围,那么您的缓冲区就会溢出。
fgets() 另一方面,允许您指定要读取的最大字节数,以防止缓冲区溢出。
这是一个简单的示例,说明如何为某些输入编写函数,以验证输入是否在指定的长度内并且是完整行(以\n- 结尾的此例程\n从输入中舍弃该输入):
void getInput(char *question, char *inputBuffer, int bufferLength)
{
printf("%s (Max %d characters)\n", question, bufferLength - 1);
fgets(inputBuffer, bufferLength, stdin);
if (inputBuffer[strlen(inputBuffer) -1] != '\n')
{
int dropped = 0;
while (fgetc(stdin) != '\n')
dropped++;
if (dropped > 0) // if they input exactly (bufferLength - 1)
// characters, there's only the \n to chop off
{
printf("Woah there partner, your input was over the limit by %d characters, try again!\n", dropped );
getInput(question, inputBuffer, bufferLength);
}
}
else
{
inputBuffer[strlen(inputBuffer) -1] = '\0';
}
}
int main()
{
char firstAnswer[10];
getInput("Go ahead and enter some stuff:", firstAnswer, 10);
printf("Okay, I got: %s\n",firstAnswer);
}
Run Code Online (Sandbox Code Playgroud)