【发布时间】: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 *。不知道如何查看崩溃发生在哪一行。