c 读取字符串导致崩溃

c read string is causing a crash

 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()。我不想传回整个名字,尽管只是一个单数。

看看这些错误:

  • 您正在使用

    scanf("%d", iPassCode);

为了阅读,但你已经声明了

int iPassCode;

scanf 需要读取指针。

替换为

scanf("%d", &iPassCode);
  • 另一个错误是你比较字符串的方式。用以下格式替换所有比较:

    if ( (strcmp(cName,"something") == 0) || (strcmp(cName,"something") == 0) )
    
  • 此外,您不能将 cName[MAX_NAME_LEN] = getchar(); 作为有效声明。

  • 最后我想你已经在某处定义了 MAX_NAME_LEN,否则你应该。

问题很多,我们一一分析

  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() returns 0 成功(匹配).

  3. 你正在写

    scanf("%d", iPassCode);
    

    应该是

    scanf("%d", &iPassCode);  //missed the address-of
    

说了这么多,从编码风格的角度,再补充一点,return是关键字,不要让它看起来像函数调用。

表达式 strcmp(cName,"leia"||"Leia") 等价于 strcmp(cName, 1).

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

如果你想检查一个字符串是否相等,你需要两次 strcmp 调用:strcmp(cName,"leia") == 0 || strcmp(cName,"Leia") == 0.