2016-04-21 110 views
0
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()。尽管只是一个单数,我不想把整个名字都传回去。c读取字符串导致崩溃

+0

'MAX_NAME_LEN' ??? ??? –

+1

'“leia”||“Leia”并没有做你认为正在做的事情。您需要两个单独的'strcmp'调用或一个'stricmp'变体。 (你错过了某个西斯主的小写版本)。 – Bathsheba

+0

'#define MAX_NAME_LEN 42'忘了提及我在开始时有这个 – JMBTaylor

回答

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 
    

所有这些之后,从一种编码风格一点,让我补充一点,return是一个关键字,不要让它看起来像一个函数调用。

+0

那么这样做? 'cName [MAX_NAME_LEN] = fgets();' – JMBTaylor

+0

@JMBTaylor不,那根本不是语法。请阅读链接手册页。 –

+0

啊,明白了。该链接是为一个Linux fgets和一个难以理解的初学者,但我需要改变它是'gets(cName);' – JMBTaylor

0

在这些错误请看:

  • 您正在使用

    的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,否则你应该这样做。
+0

这是一个看起来很糟糕的错误,但我认为程序没有那么远,因为在通知我之前它仍然崩溃。 – JMBTaylor

+0

@JMBTaylor我更新了我的帖子,看到了更多的错误,请看看:) – Marievi

3

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

子表达式"leia"||"Leia"true其在C中相当于1

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

+0

或者类似'stricmp',尽管我永远不会记得这是否是标准C。 – Bathsheba

+0

@Bathsheba Nope,这是一个Windows CRT特定功能。 C标准没有大小写不敏感的比较。 –

+0

@JoachimPileborg'strcasecmp()'怎么样? [POSIX] –