知识树中的段错误

2024-05-04

我正在用 c 实现一个可以从文件中读取的知识树。我的 newStr 函数出现段错误。我无法用这个问题测试我的其余代码。我对 c 没有太多经验。任何帮助将不胜感激。

我的 .c 文件 #包括 #包括 #include“动物.h” #包括 #包括

/*returns a new node for the given value*/
struct Node * newNode (char *newValue) 
{
struct Node * tree;
tree = (struct Node*)malloc(sizeof(struct Node));
tree -> value = newStr(newValue);
return tree;
}


/* returns a new string with value passed as an argument*/
char * newStr (char * charBuffer)
{
int i;
int length = strlen(charBuffer);
char newStr;
if(charBuffer[0] == 'A' || charBuffer[0] == 'Q'){
    for(i=1; i<length; i++)
        newStr += charBuffer[i]; 
}
return (newStr + "\0");
}

/*Read from a File and create a tree*/
struct Node * readATree(FILE * f)
{
  char c;
  char buffer[100];
  struct Node * newTree;
  c = fgetc(f);
  if (c == 'A'){
     fgets(buffer, 100, f);
     newTree = newNode(buffer);
     newTree -> left = NULL;
     newTree -> right = NULL;
    }
  else{
     fgets(buffer, 100, f);
     newTree = newNode(newStr(buffer));
     newTree->left = readATree(f);
     newTree->right = (struct Node *) readAtree(f);
     }
  return newTree;

}

/*Write Tree to a File*/
void writeAFile(struct Node* tree, FILE * f)
{
    char buffer[100];
    strcpy(buffer, tree->value);
    if(tree != 0){
        if(tree->left == NULL && tree->right == NULL){
            fputc((char)"A", f);
            fputs(buffer,f);
        } else{
            fputc((char)"Q",f);
            fputs(buffer,f);
            writeAFile(tree->left, f);
            writeAFile(tree->right,f);
        }
    }
}

/*The play should start from here*/
int main (){
    struct Node* node;
    struct Node* root;
    char ans[100];
    char q[100];
    FILE * f;
    f = fopen("animal.txt", "r+");
    if(f != NULL)
        readATree(f);
    else{
        node = newNode("Does it meow?");
    node->right = NULL;
    node->right->right=NULL;
    node->left->left=NULL;
    node->left=newNode("Cat");
    root = node;
}
while(node->left != NULL && node->right != NULL){
    printf(node->value);
    scanf(ans);
    if(ans[0] == (char)"Y" || ans[0] == (char)"y")
        node = node->left;
    else if(ans[0] == (char)"N" || ans[0] == (char)"n")
        node = node->right;
    else
        printf("That is not a valid input.\n");
}
if(ans[0] == (char)"Y" || ans[0] == (char)"y")
    printf("I win!");
else if(ans[0] == (char)"N" || ans[0] == (char)"n"){
    printf("What is your animal");
    scanf(ans);
    printf("Please enter a yes or no question that is true about %s?\n", ans);
    scanf(q);
    node->right = newNode(q);
    node->right->left = newNode(ans);
    node->right->right = NULL;
}
writeAFile(root,f);
fclose(f);
return 0;
}

.h 文件 #包括

struct Node {
char *value;
struct Node * left;
struct Node * right;
};

struct Node * newNode (char *newValue) ;
char * newStr (char * charBuffer);
struct Node * readATree(FILE * f);
void writeAFile(struct Node* tree, FILE * f);

可能还有更多,但这里有一些关于错误的地方:

  1. 你的 newStr 函数非常, 非常错误。猜测你想要 就像是:

    char * newStr (char * charBuffer)
    {
      char *newStr;
      if(charBuffer[0] == 'A' || charBuffer[0] == 'Q') {
        newStr = strdup(&charBuffer[1]);
      } else {
        newStr = strdup("");
      }
      if(newStr == NULL) {
          //handle error
      }
      return newStr;
    }
    
  2. 您无法将字符串转换为字符 就像你在这里做的那样:

     if(ans[0] == (char)"Y" || ans[0] == (char)"y")
    

    改为执行(类似代码相同 其他地方也有)

     if(ans[0] =='Y' || ans[0] == 'y')
    
  3. 当你调用 putc 时与上面相同, 不做

     fputc((char)"A", f);
    

    Do

     fputc('A', f);
    
  4. scanf 需要格式字符串,但不需要 做:

    scanf(ans);
    

    做例如(或者再次使用 fgets)

    if(scanf("%99s",ans) != 1) {
       //handle error
     }
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

知识树中的段错误 的相关文章

  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 如何自定义 DataTable 列的排序

    我需要对数据表列的值进行排序 该列包含字符串 整数或混合文本 例如 数据表列包含如下值 23 18 12 store 23 store a1 1283 25 如果我使用对值进行排序Dataview sort 方法会按此顺序产生 12 128
  • 如何知道并加载特定文件夹中的所有图像?

    我有一个应用程序 C Builder 6 0 需要知道特定文件夹中的图像总数 然后我必须加载它们 在 ImageList 或 ComboBoxEx 中 或任何其他控件中 我怎样才能做到这一点 我知道如何在控件中加载图像 或保存在 TList
  • 如何从当前 .NET 表单/应用程序发送密钥 F12

    我非常确定以下按钮激活的表单代码应该在我的 C 应用程序中引发 Control F12 SendKeys F12 但它似乎并没有继续进入 Windows shell 并激活另一个正在侦听它的程序 我的键盘可以用 看起来发送键在某处被拦截 并
  • 如何在 C# 事件中区分更改是由代码还是由用户进行?

    我有一个简单的TextBox一开始是空的 我有一个简单的事件 TextChanged 可以知道用户何时更改了其中的任何内容TextBox 但是 如果我自己在代码中对其执行任何操作 该事件就会触发 喜欢设置textbox Text Test
  • boost线程在中断时不打印退出消息

    我有这段代码用于执行三个线程 其中第二个线程应在按 Enter 时中断并打印退出消息 void input val DO STUFF return void process val DO STUFF try cout lt lt waiti
  • 有没有比这更快的方法来查找目录和所有子目录中的所有文件?

    我正在编写一个程序 需要在目录及其所有子目录中搜索具有特定扩展名的文件 这将在本地驱动器和网络驱动器上使用 因此性能是一个问题 这是我现在使用的递归方法 private void GetFileList string fileSearchP
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • Linq Where 本地计数器关闭在 VS watch 中的结果不同

    我尝试删除前 3 个元素array与 LinQWhere扩展功能 这是一个例子 var array new 1 2 3 4 5 6 7 8 9 var count 3 var deletedTest1 0 var test1 array W
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 成员初始值设定项列表中的求值顺序是什么?

    我有一个带有一些参数的构造函数 我假设它们是按照列出的顺序初始化的 但在一种情况下 它们似乎是按相反的顺序初始化的 导致中止 当我反转参数时 程序停止中止 下面是我正在使用的语法的示例 a 之前需要初始化b 在这种情况下 你能保证这个初始化
  • C#:使用 System.Text 和 System.Text.RegularExpressions 之间的区别

    在 ASP NET C 应用程序中 我注意到为了使用 Regex 和 StringBuilder 我必须将两者都放在 using System Text using System Text RegularExpressions 从简单的角度
  • 如何在不使用reinterpret_cast的情况下使用dlsym()加载函数?

    我正在尝试使用 clang tidy 来强制执行 C 核心指南 虽然它确实有很多有效点 但有一件事我无法真正解决 dlsym 返回一个void 我需要以某种方式将其转换为正确的函数指针 为此 我使用reinterpret cast 由于指南
  • C++ Primer 5th Edition 错误 bool 值没有指定最小大小?

    bool 的最小大小不应该是 1 个字节吗 这有点学术性的东西 尽管它们会转换为数字 并且 与其他所有事物一样 它们最终将基本上由计算机内存中的数字表示 但布尔值不是数字 你的bool可以取值true 或值false 即使您确实需要至少 1
  • 如何在 C++ 中使用 PI 常数

    我想在一些 C 程序中使用 PI 常数和三角函数 我得到三角函数include
  • 编写专门用于类及其子类的函数模板

    我正在尝试编写一个函数模板 一个版本应该用于不满足另一版本标准的所有类型 当参数是给定类的基类或该类本身时 应使用另一个版本 我尝试过超载Base 但是当类派生自Base 他们使用通用的 而不是特定的 我也尝试过这种 SFINAE 方法 s
  • C# ToString("MM/dd/yy") 删除前导 0 [重复]

    这个问题在这里已经有答案了 可能的重复 格式化 NET DateTime Day 不带前导零 https stackoverflow com questions 988353 format net datetime day with no
  • 便携式终端

    有没有办法根据所使用的操作系统自动使用正确的 EOL 字符 我在想类似的事情std eol 我知道使用预处理器指令非常容易 但很好奇它是否已经可用 我感兴趣的是 我的应用程序中通常有一些消息 稍后我会将这些消息组合成一个字符串 并且我希望将
  • 改进C++逐行读取文件的能力?

    我正在解析大约 500GB 的日志文件 我的 C 版本需要 3 5 分钟 我的 Go 版本需要 1 2 分钟 我正在使用 C 的流来流式传输文件的每一行以进行解析 include
  • 如何使用 g++ 在 c++ 20 中使用模块?

    我读了这个链接https gcc gnu org wiki cxx modules https gcc gnu org wiki cxx modules并尝试从该网站复制以下示例 我已经知道这个编译器部分支持模块系统 注 我用的是windo

随机推荐