【问题标题】:Checking delimiter on strtok for empty node values检查 strtok 上的分隔符是否有空节点值
【发布时间】:2021-03-30 10:33:47
【问题描述】:

所以我必须将链接列表写入文件,然后将值读入新列表,我似乎遇到的问题是当我使用 strtok 并尝试传入一个空节点(例如“”)时。我现在有分隔符,标记为“z”用于测试,我知道当 strtok 看到两个分隔符相邻时,它会完全跳过,直到找到另一个值。

我的问题是,有没有办法手动检查两个分隔符何时彼此相邻,然后将一个空节点添加到我的列表中,或者是否有一个非常简单的解决方案来解决这个问题?

typedef struct NODE {

char * value;
  struct NODE * next;
}
Node;

typedef Node ** List;


int saving_list(List list, char * fileName) {

  FILE * fptr;
  fptr = fopen(fileName, "w");
  char * s = "z";
  //char * t = "3";

  Node * list1 = * list;
  int count = 0;

  if (fptr == NULL) {
    return -1;
  }

  
  while (list1 != NULL) {
   // fputs( list1 -> value, fptr);
    //fputs(s, fptr);
    
    fputs(list1->value, fptr);
    fputs(s, fptr);
    list1 = list1 -> next;
    count++;
  }

 

  fclose(fptr);
  return count;
}


List loading_list(char * fileName) {

  List list = new_list();

  FILE * fptr;
  char buff[255];
  char * s = "z";
  char * token;

  fptr = fopen(fileName, "r");

  if (fptr == NULL) {
    return NULL;
  }

  fgets(buff, 255, (FILE * ) fptr);
  token = strtok(buff, s);
  //token = strsep (&buff, s);

  while (token != NULL) {

    char * result = malloc(sizeof(buff));
    strcpy(result, token);
    push(list,result);
    token = strtok(NULL, s);

      }
  fclose(fptr);
  return list;
}
}

【问题讨论】:

  • 据我从您的解释性文字中可以看出,您似乎对strtok 的工作方式有疑问。所有其他代码(如文件访问和列表处理)都与此问题无关。我建议edit 你的问题并创建一个minimal reproducible example 专注于strtok 问题。您可以使用重现问题的硬编码字符串初始化char buff[255];,并将mallocstrcpypush 调用替换为printf。显示实际和预期的输出。将strtok 替换为您自己的基于strchr 的实现相当容易,以获得符合您要求的行为。

标签: windows-mobile-5.0


【解决方案1】:

您可以写入值的长度,而不是分隔符。如果您希望它是人类可读的格式,那么您可以使用 strtol,并且您需要在长度和值之间使用分隔符,因为值可能以数字开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多