【问题标题】:String Extraction and Insertion Functions in C?C中的字符串提取和插入函数?
【发布时间】:2018-09-10 00:49:09
【问题描述】:

我需要写这两个函数:

前提条件:hMy_string 是有效 My_string 对象的句柄。 后置条件:hMy_string 将是一个字符串对象的句柄,该对象包含 根据以下规则从文件流 fp 中获取下一个字符串。

1) 前导空格将被忽略。

2) 所有字符(在获得并包含第一个非空白字符之后)将被添加到字符串中,直到停止条件 满足。字符串的容量将根据需要继续增长 直到所有字符都被存储。

3) 如果我们在后面读取一个空白字符,则满足停止条件 我们已经阅读了至少一个非空白字符,或者如果我们达到 文件的结尾。 如果成功读取非空字符串,函数将返回 SUCCESS。 否则失败。请记住,传入的字符串可能已经过时 包含一些数据,这个函数应该替换数据但不是 除非需要,否则必须调整数组的大小。

Status my_string_extraction(MY_STRING hMy_string, FILE* fp);

前提条件:hMy_string 是有效 My_string 对象的句柄。

后置条件:将句柄 hMy_string 指示的字符串对象中包含的字符写入文件流 fp。 如果成功写入字符串,函数将返回 SUCCESS 并且 否则失败。

Status my_string_insertion(MY_STRING hMy_string, FILE* fp);

但是,我的当前代码出现分段错误:

#include <stdio.h>
#include <stdlib.h>
#include "my_string.h"

Status my_string_extraction(MY_STRING hMy_string, FILE *fp)
{
    string *pString = (string *) hMy_string;
    int lws = 0;
    int exit = 0;
    int nws = 0;
    int i;
    int count = 0;

    while(fp != NULL && exit == 0) {
        if(pString->size >= pString->capacity) {
            char *t_data = (char *)malloc(sizeof(char) * pString->capacity * 2);
            if(t_data == NULL) {
                return FAILURE;
            }

            for(i = 0; i < pString->size; i++) {
                t_data[i] = pString->data[i];
            }

            free(pString->data);
            pString->data = t_data;
            pString->capacity *= 2;

            if(getc(fp) == ' ' && lws == 0) {
                lws++;
            } else if(getc(fp) == ' ' && lws == 1) {
                exit++;
            } else if(getc(fp) == ' ' && nws > 0) {
                exit++;
            } else {
                pString->data[count] = getc(fp);
                count++;
                pString->size++;
                nws++;
            }

            fp++;
        }

        return SUCCESS;
    }

    Status my_string_insertion(MY_STRING hMy_string, FILE *fp)
    {
        int i;
        string *pString = (string *) hMy_string;

        for(i = 0; i < pString->size; i++) {
            putc(pString->data[i], fp);
        }

        if(fp == NULL) {
            return FAILURE;
        }

        return SUCCESS;
    }

【问题讨论】:

  • MY_STRING 是什么?标题在哪里?
  • 发生崩溃时您使用的输入是什么?崩溃发生在哪一行?
  • MY_STRING 在这种情况下仅表示 void *。不知道如何查看崩溃发生在哪一行。

标签: c string file malloc free


【解决方案1】:

我的当前代码出现分段错误

你为什么这样做:

  fp++;   // incrementing pointer does not get you the next character in the file

当您尝试通过getc(fp) 获取下一个字符时,这足以导致崩溃。 fp 在那一刻将是无效的指针。

另外,我认为跨越data 边界没有限制:

    pString->data[count] = getc(fp);
    count++;  // count is not restricted from growing

【讨论】:

  • 抱歉,您说“我认为没有跨越数据边界的限制”是什么意思?另外,我将如何在没有免费的情况下增加 pString->data 的容量?当我将 t_data 的值赋给 pString->data 时,是否解决了使用释放内存的问题?
  • 我没有看到检查 count &lt; pString-&gt;capacity * 2 以防止 count 增加超出分配的内存。
  • 添加了限制但仍然没有运气。对于查明分段错误的原因有什么建议吗?
  • 我已经很长时间没有使用文件指针了,所以我认为我可以增加它以移动到文件中的下一个字符。我现在已经删除了它。像:while(getc(fp)) 这样的东西可以实现吗?
  • "我可以增加它以移动到文件中的下一个字符。" - 不,你不能那样做。 getc 将为您提供下一个字符:int ch = getc(fp); while (ch != EOF) { ch = getc(fp); }
猜你喜欢
  • 2023-03-03
  • 2018-04-19
  • 2012-05-10
  • 2016-11-24
  • 2017-01-19
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多