strcmp调用不断崩溃我的程序

时间:2016-02-18 22:21:28

标签: c string pointers scanf strcmp

我正在为学校制作一个“电话簿”计划。基本上我必须让用户将他们的联系人的姓名和电话号码输入两个不同的阵列。我得到了那个部分,但在我必须给用户一个选项,通过姓名或电话号码搜索联系人,我遇到了一些问题。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdbool.h>

int main()
{
    int arraysize;
    printf("How many phone numbers will you be entering: ");
    scanf("%d", &arraysize);

    int * phoneNumbers = malloc(arraysize);
    char * names = malloc(arraysize);

    for (int i = 0; i < arraysize; ++i)
    {
        printf("Please enter the name of person %d: ", i + 1);
        scanf("%s", &names[i]);
        printf("Please enter %s's phone number: ", &names[i]);
        scanf("%d", &phoneNumbers[i]);
    }
    char * searchOption;

    printf("Would you like to seach via name or phone number? ");
    scanf("%s", &searchOption);

    if (strcmp(searchOption, "name") == 0)
    {
        char * searchName;
        int element;
        bool stop = false;
        while (stop = false)
        {
            searchName = NULL;
            printf("\nPlease enter the name you wish to search for: ");
            scanf("%s", &searchName);
            for (int i = 0; i < arraysize; ++i)
            {
                if (strcmp(searchName, names[i]) == 0)
                {
                    element = i;
                    stop = true;
                    break;
                }
            }
            if (stop = false)
            {
                printf("\nname not found, please search again!");
            }
        }
    }

我很确定它在strcmp()调用时崩溃,但我不知道为什么

3 个答案:

答案 0 :(得分:1)

问题是,

scanf("%s", &searchOption);

你做错了。

你需要

  • 首先将内存分配给searchOption指针(或使其成为数组)。
  • 传递searchOption,而不是&searchOption传递给scanf()

同样的问题也出现在char * searchName;后面的代码中。

答案 1 :(得分:0)

崩溃不是由strcmp()电话直接引起的。

此行有错:

scanf("%s", &searchOption);

首先,存在类型不匹配。对于%s,您必须传递char*类型的参数,而不是char**。要解决此问题,请删除take-address(&)运算符。

此外,您需要分配内存以进行扫描。 scanf函数不会为您执行此操作。作为快速而肮脏的修复,您只需将searchOption设为数组即可。用

替换其声明
char searchOption[100];

或者这样来解决这个问题。您还希望限制scanf()尝试阅读的字符数:

scanf("%100s", searchOption);

所以不能有缓冲区溢出。

更好的方法是使用fgets()代替scanf()fgets()功能更适合您想要做的事情。阅读手册以了解如何使用fgets()

正如Alter Mann所说,同样的问题再次发生了第二次。你也需要修理它。

答案 2 :(得分:0)

另外我认为在strcmp中你使用了“name”,而你之前将它声明为名字。如果你纠正这个可能程序有效