【问题标题】:segmentation fault with strcmp?strcmp 的分段错误?
【发布时间】:2011-12-17 20:51:28
【问题描述】:

我试图了解我的代码崩溃的原因。我有一个结构数组,如下所示:

typedef struct contact {

    char cFirstName[10];
    char cLastName[10];
    char cTelphone[12];

} address ; // end type

在代码中我这样初始化数组:

address myContacts[5];

for ( i = 0; i < 5 ; i++ ){
        strcpy(myContacts[i].cFirstName, "0");
        strcpy(myContacts[i].cLastName,"0");
        strcpy(myContacts[i].cTelphone,"0"); 
    }

这行得通:

for ( i = 0; strcmp(myContacts[i].cFirstName,"0") != 0 ; i++ ){                                             
        printf("\nmyContacts[%d].cFirstName: %s", i, \
        myContacts[i].cFirstName );
    }// end for

所以,我只打印出有内容的联系人。

但是,我不明白为什么我的搜索联系人功能不起作用:

void searchContact( address * myContacts,    char * name ){
    int found = 1;
    int i = 0;

    for ( i = 1; found != 0 ;i++ ){
    found=strcmp(myContacts[i-1].cFirstName, name);

    printf(" Name Found %s",   myContacts[i-1].cFirstName);
    }
} // end of searchContacts

我这样称呼这个函数:

printf("\nEnter a name or part of a name to search:\n");
            fscanf(stdin, "%s", buffer);
            getchar(); // clear the last enter
            printf("\nThe line you entered was:\n");
            printf("%s\n", buffer);
            searchContact( myContacts, buffer );

如果我搜索现有名称,它会被找到,并且一切正常。然而,寻找 不存在的名称会导致分段错误。 我在这里有什么明显的遗漏吗?

【问题讨论】:

  • 你的初始化看起来很奇怪。你的意思是只有一个 0 字节作为开始?然后您应该使用"" 进行初始化,这是一个只有一个0 字节的1 字符字符串。一种更容易实现的方法是分配myContacts[i].cFirstName[0] = '\0';

标签: c strcmp


【解决方案1】:

问题在这里:

        for ( i = 1; found != 0 ;i++ ){
        found=strcmp(myContacts[i-1].cFirstName, name);

        printf(" Name Found %s",   myContacts[i-1].cFirstName);
        }

您需要添加类似for ( i = 1; found != 0 &amp;&amp; i &lt; num_of_contacts ;i++ ) 的内容 否则你会离开你的数组!

【讨论】:

  • 除了循环从i=1开始,所以条件一定是i &lt;= num_of_contacts...士气:总是以i=0开始...
  • 是的,感谢您指出。习惯于 Python 中的 for 循环:-/.
【解决方案2】:

是的:你循环超过了数组的末尾。您的循环完全没有界限。

您应该将 myContacts 上的循环限制为它实际包含的值的数量。

【讨论】:

    【解决方案3】:

    如果搜索未找到任何结果,则永远不会结束循环

    【讨论】:

      【解决方案4】:

      问题出在这里:

      for ( i = 1; found != 0 ;i++ ) {
          found=strcmp(myContacts[i-1].cFirstName, name);
      }
      

      如果您没有找到name,则循环继续超出数组的末尾。您需要在 for 循环中添加一个额外的测试,以使其在到达数组末尾而没有找到匹配项时终止。

      碰巧,我不明白为什么你的 for 循环从 1 开始。这样做会更自然:

      for (i=0; found!=0 && i<5; i++) {
          found = strcmp(myContacts[i].cFirstName, name);
      }
      

      此外,您的 found 变量名称感觉不好。它可能应该被称为notfound,因为它在没有找到名字的时候是1,但是当它有名字的时候是0

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-11
        • 2018-10-08
        • 1970-01-01
        • 1970-01-01
        • 2015-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多