【问题标题】:strcmp call keeps crashing my programstrcmp 调用不断使我的程序崩溃
【发布时间】:2016-02-18 22:21:28
【问题描述】:

我正在为学校创建一个“电话簿”程序。基本上我必须让用户将他们联系人的姓名和电话号码输入到两个不同的数组中。我把那部分记下来了,但是在我必须让用户选择通过姓名或电话号码搜索联系人之后,我遇到了一些问题。

#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() 时崩溃了,但我不知道为什么

【问题讨论】:

  • while (stop = false) -- 这是一个任务。应该是while (stop == false)。实际上,不,不应该;它应该是while (!stop)。接近尾声的if 也是如此。
  • 您是否启用了编译器警告?我想编译器会有选择词供您使用char *searchOption[256];
  • @EOF:将其传递给strcmp 应该会导致警告(或致命错误)。将其传递给scanf 同样不正确,但不一定会触发不够聪明的编译器发出的警告。 (gcc 足够聪明)。
  • 您更改了问题中的代码以响应答案,但没有提及您更改了它。 请不要那样做。原来你有char * searchOption;。您将其更改为char * searchOption[256];,这是一个包含 256 个指针的数组。不要试图“修复”问题中的代码;这样做会使问题和答案都无效。我要回滚你最近的编辑。
  • @EOF:代码已编辑。我已经回滚了。

标签: c string pointers scanf strcmp


【解决方案1】:

问题是,在

scanf("%s", &searchOption);

你做错了。

你需要

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

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

【讨论】:

  • scanf("%s", &amp;searchName); 相同
  • @AlterMann 对。在此之后我不再看到代码。让我也更新一下。 :)
  • 我按照你说的做了,它不再崩溃了,但是当我输入“name”时它没有进入if语句,我会用我现在的代码更新我的代码
  • 在 POSIX 系统上,%ms&amp;searchOption 将为您分配空间。但这有点先进——并非所有系统都支持这种表示法。
【解决方案2】:

崩溃不是由strcmp() 调用直接引起的。

这条线路有问题:

scanf("%s", &searchOption);

首先,类型不匹配。对于%s,您必须传递char* 类型的参数,而不是像您那样传递char**。要解决此问题,请删除取地址 (&amp;) 运算符。

此外,您需要分配内存以进行扫描。 scanf 函数不适合你。作为一个快速而肮脏的修复,您可以简单地将searchOption 设为一个数组。将其声明替换为

char searchOption[100];

或类似的东西来解决这个问题。您还想限制scanf() 尝试读取的字符数:

scanf("%100s", searchOption);

所以不会有缓冲区溢出。

更好的方法是使用fgets() 而不是scanf()fgets() 函数更适合您想做的事情。阅读手册了解如何使用fgets()

正如Alter Mann 所说,同样的问题在更远的地方第二次出现。你也需要修复它。

【讨论】:

    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      相关资源
      最近更新 更多