c读取字符串导致崩溃

时间:2016-04-21 06:57:21

标签: c string strcmp getchar

 int iPassCode, iNumber = 0;

void main()
{
    iNumber = get_name();
    iPassCode = get_code();
    name_strucutre();
}

int get_name()
{
    printf("Please enter your name: ");
    cName[MAX_NAME_LEN] = getchar();
    if(strcmp(cName,"leia"||"Leia"))
    {
        iNumber = 1;
    }
    if(strcmp(cName,"darth"||"Darth"))
    {
        iNumber = 2;
    }
    if(strcmp(cName,"r2d2"||"R2D2"))
    {
        iNumber = 3;
    }
    if(strcmp(cName,"solo"||"Solo"))
    {
        iNumber = 4;
    }
    if(strcmp(cName,"jabba"||"Jabba"))
    {
        iNumber = 5;
    }
    if(strcmp(cName,"yoda"||"Yoda"))
    {
        iNumber = 6;
    }
    else
    {
        iNumber = 0;
    }
    return(iNumber);
}

int get_code()
{
    printf("Please enter your pass code: ");
    scanf("%d", iPassCode);
    return (iPassCode);
}

我在这里得到了一些功能。其中一个我认为get name()函数导致程序崩溃。现在,我尝试做的就是从用户那里收集名称和密码并将信息传递回main()。我不想通过一个单数来传递整个名字。

3 个答案:

答案 0 :(得分:3)

有很多问题,让我们一个一个地分析它们

  1. 首先,

    cName[MAX_NAME_LEN] = getchar();
    

    无效,因为

    • 根据最新标准,默认为int 不再是标准。您需要定义数据类型

    • getchar()的一次调用会读取一个char。至少你需要一个循环。

    您需要更改为

    char cName[MAX_NAME_LEN] = {0};
    

    然后循环getchar()以读取输入。

    否则,为了更好,请使用fgets()来读取和存储输入。

  2. 也就是说,您无法在单个调用中比较多个字符串,如

    if(strcmp(cName,"leia"||"Leia"))
    

    这基本上是

    if(strcmp(cName,1))
    

    这又是非法的。您可以使用strcasecmp()忽略该案例。否则,要严格遵守标准,您必须使用单独的strcmp()调用来将字符串与每个验证器进行比较。

    是的,strcmp()会在成功(匹配)时返回0

  3. 您正在写

    scanf("%d", iPassCode);
    

    应该是

    scanf("%d", &iPassCode);  //missed the address-of
    
  4. 毕竟,从编码风格的角度来看,让我补充一点,return是一个关键字,不要让它看起来像一个函数调用。

答案 1 :(得分:3)

表达式strcmp(cName,"leia"||"Leia")相当于strcmp(cName, 1)

子表达式"leia"||"Leia" true ,在C中等同于1

如果您想检查字符串是否相等,则需要进行两次strcmp来电:strcmp(cName,"leia") == 0 || strcmp(cName,"Leia") == 0

答案 2 :(得分:0)

看看这些错误:

  • 您正在使用

    scanf("%d",iPassCode);

为了阅读,但你已宣布

c := t.Content[0]
if c != '.' && c != ',' && c != '?' && c != '“' && c != '”'{

int iPassCode; 需要读取指针。

将其替换为

scanf
  • 另一个错误是比较字符串的方式。用以下格式替换所有比较:

    scanf("%d", &iPassCode);
    
  • 此外,您不能将if ( (strcmp(cName,"something") == 0) || (strcmp(cName,"something") == 0) ) 作为有效声明。

  • 最后我想你已经在某处定义了cName[MAX_NAME_LEN] = getchar();,否则就应该。