C 如何从fgets中检测空字符串
我试图检测stdin中fgets的输入是否为空(当我按enter键而不输入任何内容时)。这是我的节目:C 如何从fgets中检测空字符串,c,input,fgets,C,Input,Fgets,我试图检测stdin中fgets的输入是否为空(当我按enter键而不输入任何内容时)。这是我的节目: int main() { char input[1000]; printf("Enter :"); fgets(input, 1000, stdin); input[strlen(input) - 1] = '\0'; if(input != '\0'){ printf("hi"); } return 0; } 我
int main()
{
char input[1000];
printf("Enter :");
fgets(input, 1000, stdin);
input[strlen(input) - 1] = '\0';
if(input != '\0'){
printf("hi");
}
return 0;
}
我想做一些条件,使它不打印任何东西,但显然这种方式是不正确的。我还尝试了NULL,但无效
谢谢 我认为这是最具可读性(但不是最好的): 但为了教学,这里是你的风格,但随后固定:
if (input[0] != '\0') {
printf("hi");
}
为什么
输入[0]
?因为input
的作用类似于指向数组第一个元素的指针,如果您这样比较它,那么首先必须取消对它的引用以使比较有用。显而易见的方法是:
if (input[0] != '\0')
printf("hi");
虽然使用strlen可以工作,但它可能相当浪费——它会将O(1)操作变成O(N)。fgets会在按下返回键时返回“\N”;这将使总字符串为“\n\0”。您可以使用此值进行字符串比较,但更可靠的解决方案是“去除”或“修剪”字符串以删除所有前导和尾随空格(在任何处理之前都应该这样做),然后检查空字符串
最简单的修改是检查
(*input!='\n')
。我应该注意到,这还要求您删除空终止代码,这会去掉这条换行符(大概是设计上的)。为了安全起见,最好使用以下代码:
if(u_input[0] == '\n' && u_input[1] == '\0'){
printf("hi");
}
+1,但
input
是一个数组,而不是指向数组的指针。在比较的上下文中,它确实会衰减为指针,但是区分是很重要的。是的,但是您编辑了相同(错误)的语句。数组和指针不是一回事,即使它们在这种特定情况下可以互换使用。“数组是指针,如果你这样对待它们”不,数组可以用作指针,但这并不意味着它是指针。@JamesMcNellis事实上,这行永远不会做任何事情,无论输入来自何处。strlen
函数只搜索字符串中的第一个'\0'
,因此根据定义input[strlen(input)-1]='\0'
。如果输入
不是以null结尾的,并且在程序的地址空间用完之前没有紧跟任何'\0'
,那么它唯一可以改变的就是引入segfault。
if(u_input[0] == '\n' && u_input[1] == '\0'){
printf("hi");
}