【问题标题】:c language strchr segmentation fault character replacec语言strchr分段错误字符替换
【发布时间】:2011-11-01 12:43:04
【问题描述】:

我需要将 C 字符串中每次出现的 '&' 替换为 ','。

我这样做了,它有效

代码 1:

char *val, *querydup;
.
.
.
val=strchr(querydup,'&');
while(val != NULL) {
*val=',';
val=strchr(querydup,'&');
}

为了“优雅”,我尝试了以下操作,但它导致了段错误,甚至我的指针光标都被破坏了!奇怪,我在 vmware vm 中运行 linux。

代码 2:

while(val=strchr(querydup,'&') != NULL) {
*val=',';
}

那么有什么问题呢?..

你认为代码 1 是“优雅的”吗?...

问候。

【问题讨论】:

  • 我建议您将val=strchr(querydup,'&') 放在if 语句内的括号内。

标签: c string segmentation-fault strchr


【解决方案1】:

你的主要问题has been answeredemboss

我正在回答“优雅”部分:)

你一遍又一遍地检查相同的字符。

假设querydup"&&&&&&&&&&"。在最初的几次更改之后,它具有",,,,,,&&&&",但您仍然从头开始检查。

尝试将val 重新用于“优雅”:)

val = strchr(val, '&');

【讨论】:

  • 如果你这样做,你需要将val初始化为querydup,所以for()循环可能是最优雅的:for (val = querydup; val != NULL; val = strchr(val, '&'))
  • @caf:假设querydup 永远不能为NULL,我更喜欢do {} while () 并避免冗余测试(相当于querydup != NULL)。 val = querydup; do { val = strchr(val, '&'); if (val) *val++ = ','; } while (val); /* trust compiler to only test val once :) */
  • @pmg:如果你要走那条路,那val = querydup; while (val = strchr(val, '&'), val != NULL) *val = ',';
  • 这看起来也不错@caf。您省略了 ++ 以增加 val 超过新的 ',' :) 哦...而且我不喜欢逗号运算符和在条件内塞进太多的工作。
  • 就我个人而言,我只会使用for() 循环版本 - 针对NULL 的单个额外测试的开销不值得担心,并且在许多情况下编译器将能够省略它反正。我认为你不公平地边缘化了逗号运算符;)
【解决方案2】:

operator precedence,试试

while((val=strchr(querydup,'&')) != NULL) {
    *val=',';
}

【讨论】:

    【解决方案3】:

    也许更简单的解决方案是手动进行:

    char *ptr = querydup;
    while (*ptr) {
        if (*ptr == '&') {
            *ptr = ',';
        }
        ptr++;
    }
    

    代码行数较多,但只遍历字符串一次,而strchr()的重复执行会多次遍历字符串。

    【讨论】:

    • 第一次忘记增加ptr!
    • 看起来不错,但是 pmg 的解决方案似乎更加“优雅”:) 谢谢!
    【解决方案4】:

    您正在为 val 分配一个布尔值。您的代码相当于:

    while(val = (strchr(querydup,'&') != NULL))
    

    改成:

    while((val = strchr(querydup,'&')) != NULL)
    

    【讨论】:

    • 最后一个无效。 != 的优先级高于=,因此= 运算符的左侧是NULL != val,它不是左值。
    猜你喜欢
    • 2021-10-15
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多