程序在scanf()中格式化字符串和字符转换之前没有空格退出
问题描述:
为什么当我在scanf()
格式说明符之前使用空格时,程序工作正常。下面的代码:程序在scanf()中格式化字符串和字符转换之前没有空格退出
printf("What's your username: ");
scanf(" %s", username);
printf("Do you want to make a deposit or a withdrawal? [d/w]\n");
scanf(" %c", &choice);
当我没有像下面这段代码的空间,它退出:
printf("What's your username: ");
scanf("%s", username);
printf("Do you want to make a deposit or a withdrawal? [d/w]\n");
scanf("%c", &choice);
是否有一个很好的解释这个?
答
是的,有一个很好的解释,并且解释是当您尝试读取第二个输入的字符时,您为第一个输入输入的换行符仍然在缓冲区中。使用格式读取单个字符将读取输入缓冲区中的第一个字符,而不管它是什么。
通过添加前导空格,您可以告诉scanf
读取并丢弃所有前导空格。
大多数格式都会自动执行此操作,例如"%s"
格式,因此您不需要格式字符串中的前导空格。阅读例如this scanf
(and family) reference了解更多信息,以及您需要明确跳过前导空格的格式。
答
发生这种情况是因为scanf
跳过了空白区域当它读取整数或char等数据时。空格字符是那些影响屏幕上字符间距和格式的字符,不会打印任何可见的字符。您可以键入作为用户的空格字符是空格(空格键),制表符(Tab键)和换行符(Enter键)。参考链接here。
我已经看到至少有一个评分问题归结为这个问题。这是否已经有一个很好的规范问题? –