即使没有来自用户的输入,字符串也有内容

我试图“捕获”来自用户的键盘输入,这意味着代码将阻止它们输入某些字符,在这种情况下会阻止输入数字和特殊字符。

#include  #include  #include  #include  #include  char buffer[30]; void in_text(); int main(void) { in_text(); printf ("\nThe string you entered is: %s", buffer); return 0; } void in_text(void) { char buffe[30]; char c1; int x = 0, hit = 0; printf("Enter string: "); while (hit!=1) { c1 = getch(); if (c1=='\b' && x!=0) { buffe[--x] = '\0'; printf ("\b \b"); } if (isalpha(c1) || isspace(c1) && c1!='\r') { buffe[x++] = c1; buffe[x+1] = '\0'; printf("%c", c1); } if (c1=='\r' && strlen(buffe)==0) { buffe[x+1] = '\0'; } else if (c1=='\r' && strlen(buffe)>1) { printf ("%d", strlen(buffe)); printf ("\n%s", buffe); hit = 1; } else{ } } strcpy(buffer, buffe); return 1; } 

此代码尝试模仿可以看到的scanf输入样式,并按退格键删除以前输入的字符。 我想“捕获”回车键,以便当用户按下“Enter”时,程序检查当前字符串(buffe)是否包含至少一个有效字符,并且当程序检查输入时发现用户按下了Enter键和字符串不包含任何内容,循环继续。

我的代码的问题是,当我按下Enter时,在程序启动后立即, strlen函数返回一个大于0的值,我认为这是不正常的,因为除了那个“Enter”之外还没有来自用户的输入“用户按下的键。

有什么想法吗?

在这里读取未完成的变量,比如对buffe进行的操作:

 if (c1=='\r' && strlen(buffe)==0) 

挑起不确定的行为,事后可能发生任何事情。 不要这样做。

始终在读取变量之前初始化变量。

在这种情况下,您可能只想这样做:

 char buffe[32] = ""; 

或(如他人已经提出的)更通用的方式:

 char buffer[32] = {0}; 

更复杂但也有效的方法是:

 char buffer[32]; strcpy(buffe, ""); 

要么

 char buffer[32]; memset(buffe, 0, sizeof(buffe)); 

可能会尝试

 char buffe[30] = {0}; 

(我没试过这个thouggh)

记忆总是包含一些东西 你的变量使用的空间包含一些东西,并且调用strlen()就好不会在某处爆炸。

请注意,操作系统通常会读取整行(并允许对其进行编辑),仅在ENTER上将其发送到读取应用程序。 处理这个问题比简单阅读要难得多。 你确定它不足以获得一条线,检查并抱怨或继续吗?

因为你的buffe将在堆栈上获得内存它将包含一些垃圾值你最好用零或更好的方式初始化它是使用memset()函数。