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

时间:2014-03-14 00:51:33

标签: c

我正在努力"陷阱"来自用户的键盘输入,这意味着代码将阻止它们输入某些字符,在这种情况下会阻止输入数字和特殊字符。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

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输入样式,然后按退格键删除以前输入的字符。我想&#34;陷阱&#34;输入键,当用户按下&#34;输入&#34;时,程序检查当前字符串(buffe)是否包含至少一个有效字符,当程序检查输入时发现用户按下了输入密钥,字符串不包含任何内容,循环继续。

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

对此有何想法?

4 个答案:

答案 0 :(得分:2)

可以尝试

char buffe[30] = {0};

(我还没试过这个)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在此处读取未完成的变量,例如对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));