【问题标题】:strchr causing segmentation fault in Cstrchr 在 C 中导致分段错误
【发布时间】:2014-04-24 10:25:54
【问题描述】:

我的 C 程序有问题。 我知道strchr() 导致了问题,并且它正在返回

分段错误

我的代码如下:

char *pointer;
pointer = strchr(string, character);

我不知道为什么会收到错误消息。 我能猜到的一件事是我的“字符串”有时不包含字符。这可能是原因吗?

由于我无法控制输入字符串,我该如何阻止它?

完整代码

int index(const char *string, char character)
{
    const char *pointer;
    pointer = strchr(string, character);

    if(pointer)
        return (pointer - string);
    else
        return -1;
}

【问题讨论】:

  • string 肯定 null 终止了吗?
  • 你在strchr之后检查pinterNULL吗?
  • 你能展示你剩下的代码吗?你可以误用 strchr ....
  • 这个函数看起来没问题,问题可能出在调用者身上。也许它没有正确分配字符串。
  • @Jordan 是的,这就是原因。当字符串为空时strchr() 不起作用。

标签: c string strchr


【解决方案1】:

首先,尝试为您的方法打印输入。

来自here

strchr 函数在字符串中搜索第一次出现的 c。搜索中包含空字符终止字符串。

你确定你的字符串是合法的吗? (表示以null结尾)

我认为这可能会导致您的问题

【讨论】:

    【解决方案2】:

    strchr(char *string, int c) 函数返回指向字符串中第一次出现的字符 c 的指针,如果没有找到匹配的字符,则返回 NULL 指针.

    由于搜索中包含空字符终止字符串,因此您必须确保您的字符串以空字符结尾,否则搜索超出范围。

    如果您想打印字符串或对结果执行其他操作,请先检查指针;在您的具体情况下:

    if(pointer != NULL)
       printf(...);
       [...]
    

    【讨论】:

      【解决方案3】:

      要编写保存代码总是执行输入验证:

      无论哪种方式都很难(如果不应该传入NULL):

      ssize_t index(const char * string, const char character)
      {
        assert(NULL != string);
      
        const char * pointer = strchr(string, character);
      
        if (pointer)
        {
          return (pointer - string);
        }
        else
        {
          return -1;
        }
      } 
      

      或者顺风顺水(默默对待NULL""一样):

      ssize_t index(const char * string, const char character)
      {
        const char * pointer = NULL;
      
        if (string)
        {
          pointer = strchr(string, character);
        }
      
        if (pointer)
        {
          return (pointer - string);
        }
        else
        {
          return -1;
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2021-06-16
        • 2020-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多