【问题标题】:C- main segmentation fault, string problem - how to solve [duplicate]C-主要分段错误,字符串问题-如何解决[重复]
【发布时间】:2021-01-27 14:35:29
【问题描述】:

我的主函数需要从用户那里收集数组大小并用字符串填充它,然后发送给函数 - 我的主函数在收到单个字符串后似乎崩溃了 - 我相信错误是由于临时字符串造成的 - 当它确实有效时我没有得到任何迹象表明数组实际上进入了函数并且输出与输入相同 - 我不知道为什么。

int main() {
    int n = 0, rule = 0;
    char* temporary_string="";
    printNumStringsInputMessage();
    scanf("%d", &n);
    printStringsInputMessage(n);
    char** arr_of_strings= malloc(n * sizeof(char*));
    for (int l = 0; l < n; l++)
    {
        scanf("%s", temporary_string);
        arr_of_strings[l] = malloc((strlen(temporary_string) * sizeof(char)));
        strcpy(arr_of_strings[l], temporary_string);
        strcpy(temporary_string,"");
    }
    printRuleOfComparisonInputMessage();
    scanf("%d", &rule);
    return (0);
}

【问题讨论】:

  • 在对代码进行一些修改后,它确实有效,尽管它确实发送警告
  • 是的,我认为确实如此,尽管这是理论上的,我不确定我是否能够在没有特别注意的情况下纠正我的程序

标签: arrays c string


【解决方案1】:

你不能改变这个值:char* temporary_string="";,它是常数,和const char* temporary_string="";一样,这会导致分段错误。 改为使用字符数组。

【讨论】:

    【解决方案2】:

    您不得修改字符串文字。

    代替

        char* temporary_string="";
    

    你应该像这样分配一个可修改的数组:

        char temporary_string[102400];
    

    限制读取的最大大小以避免缓冲区溢出也是一个好习惯。

            scanf("%s", temporary_string);
    

    应该是

            scanf("%102399s", temporary_string);
    

    如果你使用上面的数组。最大长度是数组的长度减一,因为最后一个元素用于终止空字符。

    您还必须为终止空字符分配。 这意味着这一行

            arr_of_strings[l] = malloc((strlen(temporary_string) * sizeof(char)));
    

    应该是

            arr_of_strings[l] = malloc(((strlen(temporary_string)+1) * sizeof(char)));
    

    【讨论】:

    • 这是一个大字符串。
    • @AdrianMole 但可能会有更大的字符串...
    • 建议确实停止了分段错误,并且我确实得到了 MAX_LEN 的 const,所以我按照您的建议使用了它 - 程序现在确实进入了函数(它仍然表现得很奇怪,但我会看看那个),谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多