【问题标题】:Functions in my program seem to not be waiting for other functions to finish我程序中的函数似乎没有等待其他函数完成
【发布时间】:2019-08-08 12:25:27
【问题描述】:

我是编码新手,这是我的第一个大任务。 我必须设计一个程序,从标准输入接收输入并在被询问时输出特定数据(通过“报告”命令)

int main()
{
  const char Comando[6][7]={"addrel","addent","delrel","delent","report","end"};
  const char spazio[2]= " ";
  const char newline[3] = "\n";
  const char quote[2]= "\"";
  char sample[100];
  char *temp;
  char *comandoIN;
  char *argomento1;
  char *dest;
  char *rel;


  RelHead = NULL;
  init_array();

  char *str = fgets(sample, 100, stdin);
/*I am not going to use str, but apparently I have to do this , otherwise it won't compile*/

    for(;;)
    {
      if (strncmp (sample, Comando[5], 3)==0)
      {
        return 0; //check if input is end, if so terminate
      }
      else
      {
        //parse by eliminating \n character and quotes containing arguments
        temp = strtok(sample, newline);
        comandoIN = strtok(temp, spazio);
        argomento1 = strtok(NULL, quote);
        temp = strtok(NULL, quote);
        dest = strtok(NULL, quote);
        temp = strtok(NULL, quote);
        rel = strtok(NULL, quote);

        if (strncmp(Comando[0], comandoIN, 7)==0)
          {
            addrel(argomento1, dest, rel);
          }
        else if (strncmp(Comando[1], comandoIN, 7)==0)
          {
            addent(argomento1);
          }
        else if (strncmp(Comando[2], comandoIN, 7)==0)
          {
            delrel(argomento1, dest, rel);
          }
        else if (strncmp(Comando[3], comandoIN, 7)==0)
          {
            delent(argomento1);
          }
        else if (strncmp(Comando[4], comandoIN, 7)==0)
          {
            report();
          }
        }

      char *str = fgets(sample, 69, stdin);
    }
  return 0;
}

当我尝试使用教授给出的一些标准化输入来测试程序时,程序似乎在调用“report”后没有立即输出,而是继续读取并稍后输出。

例如,这个输入:

addent "Elijah_Baley"
addent "Bentley_Baley"
addent "Jesse_Baley"
addent "Gladia_Delmarre"
addent "Han_Fastolfe"
addent "Vasilia_Aliena"
addent "R_Daneel_Olivaw"
addent "R_Giskard_Reventlov"
addent "Kelden_Amadiro"
addent "Santirix_Gremionis"
addent "Rikaine_Delmarre"
report
addent "Jothan_Leebig"
addent "The_Chairman"
addent "R_Jander_Panell"
addent "Hannis_Gruer"
addrel "Elijah_Baley" "Jesse_Baley" "loves"
report
addrel "Gladia_Delmarre" "Elijah_Baley" "loves"
addrel "Rikaine_Delmarre" "Jothan_Leebig" "is_killed_by"
addrel "Jesse_Baley" "Elijah_Baley" "loves"
report
addrel "R_Jander_Panell" "R_Giskard_Reventlov" "is_killed_by"
addrel "Santirix_Gremionis" "Gladia_Delmarre" "loves"
addrel "Gladia_Delmarre" "R_Jander_Panell" "loves"
addrel "Elijah_Baley" "Kelden_Amadiro" "is_killed_by"
addrel "Gladia_Delmarre" "Elijah_Baley" "is_killed_by"
report
addrel "Elijah_Baley" "Gladia_Delmarre" "loves"
addrel "R_Jander_Panell" "Kelden_Amadiro" "is_killed_by"
addrel "Vasilia_Aliena" "Han_Fastolfe" "loves"
report
addrel "Jesse_Baley" "Jothan_Leebig" "is_killed_by"
addrel "Bentley_Baley" "Elijah_Baley" "loves"
report
addrel "Rikaine_Delmarre" "Gladia_Delmarre" "loves"
addrel "R_Jander_Panell" "Kelden_Amadiro" "is_killed_by"
addrel "Santirix_Gremionis" "Vasilia_Aliena" "loves"
addrel "Vasilia_Aliena" "Kelden_Amadiro" "loves"
addrel "Kelden_Amadiro" "R_Daneel_Olivaw" "loves"
report
addrel "Santirix_Gremionis" "Elijah_Baley" "is_killed_by"
addrel "Han_Fastolfe" "Vasilia_Aliena" "loves"
report
addrel "The_Chairman" "Jothan_Leebig" "is_killed_by"
addrel "Hannis_Gruer" "Gladia_Delmarre" "loves"
addrel "R_Daneel_Olivaw" "Vasilia_Aliena" "is_killed_by"
addrel "The_Chairman" "Gladia_Delmarre" "loves"
addrel "R_Giskard_Reventlov" "Gladia_Delmarre" "loves"
addrel "Vasilia_Aliena" "R_Giskard_Reventlov" "loves"
report
addrel "Vasilia_Aliena" "Jesse_Baley" "is_killed_by"
addrel "Kelden_Amadiro" "Han_Fastolfe" "is_killed_by"
addrel "Santirix_Gremionis" "R_Daneel_Olivaw" "loves"
report
addrel "The_Chairman" "Kelden_Amadiro" "is_killed_by"
report
end

输出这个:

addent "Elijah_Baley"
addent "Bentley_Baley"
addent "Jesse_Baley"
addent "Gladia_Delmarre"
addent "Han_Fastolfe"
addent "Vasilia_Aliena"
addent "R_Daneel_Olivaw"
addent "R_Giskard_Reventlov"
addent "Kelden_Amadiro"
addent "Santirix_Gremionis"
addent "Rikaine_Delmarre"
report
addent "Jothan_Leebig"
addent "The_Chairman"
addent "R_Jander_Panell"
addent "Hannis_Gruer"
addrel "Elijah_Baley" "Jesse_Baley" "loves"
report
addrel "Gladia_Delmarre" "Elijah_Baley" "loves"
addrel "Rikaine_Delmarre" "Jothan_Leebig" "is_killed_by"
addrel "Jesse_Baley" "Elijah_Baley" "loves"
report
addrel "R_Jander_Panell" "R_Giskard_Reventlov" "is_killed_by"
addrel "Santirix_Gremionis" "Gladia_Delmarre" "loves"
addrel "Gladia_Delmarre" "R_Jander_Panell" "loves"
addrel "Elijah_Baley" "Kelden_Amadiro" "is_killed_by"
addrel "Gladia_Delmarre" "Elijah_Baley" "is_killed_by"
report
addrel "Elijah_Baley" "Gladia_Delmarre" "loves"
addrel "R_Jander_Panell" "Kelden_Amadiro" "is_killed_by"
addrel "Vasilia_Aliena" "Han_Fastolfe" "loves"
report
addrel "Jesse_Baley" "Jothan_Leebig" "is_killed_by"
addrel "Bentley_Baley" "Elijah_Baley" "loves"
report
addrel "Rikaine_Delmarre" "Gladia_Delmarre" "loves"
addrel "R_Jander_Panell" "Kelden_Amadiro" "is_killed_by"
addrel "Santirix_Gremionis" "Vasilia_Aliena" "loves"
addrel "Vasilia_Aliena" "Kelden_Amadiro" "loves"
addrel "Kelden_Amadiro" "R_Daneel_Olivaw" "loves"
report
addrel "Santirix_Gremionis" "Elijah_Baley" "is_killed_by"
addrel "Han_Fastolfe" "Vasilia_Aliena" "loves"
report
addrel "The_Chairman" "Jothan_Leebig" "is_killed_by"
addrel "Hannis_Gruer" "Gladia_Delmarre" "loves"
addrel "R_Daneel_Olivaw" "Vasilia_Aliena" "is_killed_by"
addrel "The_Chairman" "Gladia_Delmarre" "loves"
addrel "R_Giskard_Reventlov" "Gladia_Delmarre" "loves"
addrel "Vasilia_Aliena" "R_Giskard_Reventlov" "loves"
report
addrel "Vasilia_Aliena" "Jesse_Baley" "is_killed_by"
addrel "Kelden_Amadiro" "Han_Fastolfe" "is_killed_by"
addrel "Santirix_Gremionis" "R_Daneel_Olivaw" "loves"
report
addrel "The_Chairman" "Kelden_Amadiro" "is_killed_by"
renone //Starts outputting here, between "re" and "port", 9 lines below
"loves" "Jesse_Baley" 1;
"is_killed_by" "Jothan_Leebig" 1; "loves" "Elijah_Baley" 2;
"is_killed_by" "Jothan_Leebig" 1; "loves" "Elijah_Baley" 2;
"is_killed_by" "Kelden_Amadiro" 2; "loves" "Elijah_Baley" 2;
"is_killed_by" "Kelden_Amadiro" "Jothan_Leebig" 2; "loves" "Elijah_Baley" 3;
"is_killed_by" "Kelden_Amadiro" "Jothan_Leebig" 2; "loves" "Elijah_Baley" 3;
"is_killed_by" "Kelden_Amadiro" "Jothan_Leebig" 2; "loves" "Elijah_Baley" 3;
"is_killed_by" "Jothan_Leebig" 3; "loves" "Gladia_Delmarre" 6;
"is_killed_by" "Jothan_Leebig" 3; "loves" "Gladia_Delmarre" 6;
port
end
"is_killed_by" "Jothan_Leebig" 3; "loves" "Gladia_Delmarre" 6;

所以我的理解是它在完成阅读后输出,这不是预期的行为

【问题讨论】:

  • 乍一看,您的“输出”似乎与您的“输入”相同。这是一个复制粘贴错误,还是这实际上是程序输出的内容?创建一个较小的示例,显示实际输出并显示您的预期输出可能会有所帮助。可能还需要显示report() 的主体和至少一个其他函数,例如addent()
  • @DaveCosta 似乎输出在底部附近出错,插入了额外的文本块。 //Starts outputting here, between "re" and "port", 9 lines below
  • 您没有显示任何生成输出的代码。请创建一个minimal, complete and verifiable example
  • 旁白:惯用的循环控制是 while(fgets(sample, sizeof sample, stdin) != NULL) { ... } 并删除 for(;;)
  • 调用“report”后没有“输出”。大概是report() 输出?您尚未提供生成该输出的代码。您是否有机会使用 Eclipse?如果是这样,我赌这个问题:stackoverflow.com/questions/22877966/…

标签: c


【解决方案1】:

当输入文本是

report

strtok已经返回NULL时,你继续调用它。

这会导致未定义的行为,因为不知道当strtok 继续在您的输入范围之外进行解析时会发生什么,尤其是当它将一个 nul 终止符写入您的内存之外的某个地方时字符串。

因此,您正在通过这种做法导致内存损坏。解决方案是在返回NULL 时停止调用strtok,因为没有更多令牌可以提取

【讨论】:

  • 就是这样,再次感谢您!你在这个网站的任何地方
猜你喜欢
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 2021-07-15
  • 2021-01-07
  • 1970-01-01
  • 2022-12-01
相关资源
最近更新 更多