【问题标题】:Split string without affecting the source在不影响源的情况下拆分字符串
【发布时间】:2014-03-06 23:03:18
【问题描述】:

我如何strtok文件名使原始字符串不受影响?

void generate_header(int sock, char* filename, int response_code) {

  char buffer[BUFLEN];

  // For Content-Type generation                                                                                                   
  char *file_format;
  const char delimiter[2] = ".";
  file_format = strtok(filename, delimiter);
  file_format = strtok(NULL, delimiter);

  // Generate response code                                                                                                        
  /*
  ........ ommited ..........
  */

  // Generate Content-Type                                                                                                         
  if (strcmp(file_format, "html") == 0 || strcmp(file_format, "htm") == 0) {
    strncat(buffer, "Content-Type: text/html\n", sizeof(buffer) - strlen(buffer) - 1);
  }
  else if (strcmp(file_format, "txt") == 0) {
    strncat(buffer, "Content-Type: text/plain\n", sizeof(buffer) - strlen(buffer) - 1);
  }
  else if (strcmp(file_format, "jpg") == 0 || strcmp(file_format, "jpeg") == 0) {
    strncat(buffer, "Content-Type: image/jpeg\n", sizeof(buffer) - strlen(buffer) - 1);
  }
  else if (strcmp(file_format, "gif") == 0) {
    strncat(buffer, "Content-Type: image/gif\n", sizeof(buffer) - strlen(buffer) - 1);
  } else {
    strncat(buffer, "Content-Type: application/octet-stream\n", sizeof(buffer) - strlen(buffer) - 1);
  }

  // End                                                                                                                           
  strncat(buffer, "Connection: close\n", sizeof(buffer) - strlen(buffer) - 1);

  // Push                                                                                                                          
  write(sock, buffer, strlen(buffer));
}

【问题讨论】:

  • 为什么会有c++C 标签?哪一个?他们不一样?!
  • 如果你使用 C++:使用 std::string,在循环中使用 find_first_of(),放弃 C 的东西。
  • 另外,如果您的目标是获取文件扩展名,那么在不使用 strtok 的情况下,您是否应该使用一个系统函数来执行此操作?大多数(如果不是全部)主要的 C++(甚至 C)编译器库都带有这样的功能。
  • 试试 -- char file_name = [100]; strcpy(file_name, strtok(filename, delimiter));
  • 1) 在if()s 之后代码对strlen(buffer) 的使用不好。 buffer 调用前未设置内容。 2)strncat(buffer, ... 不好,因为在// End ... strlen(buffer) - 1) 中的以下strlen() 调用不保证buffer'\0' 结尾。

标签: c string cstring c-strings


【解决方案1】:

你不需要strtokstrrchr可以找到最后出现的分隔符:

if((file_format = strrchr(filename, '.')) == NULL)
    file_format = ""; /* no delimiter present */
else
    ++file_format; /* step over the delimiter */

【讨论】:

    【解决方案2】:

    你先复制它。然后在其上运行 strtok ,它将出现的分隔符替换为空值。

    如果您想在不修改原始字符串或复制它的情况下取出字符串的各个部分(我假设您想将这些片段复制到目标字符串中),那么您只需迭代它直到到达下一个分隔符,跟踪开始和结束位置并复制它们。

    您不能指向原始字符串的前半部分,并期望在不修改或复制的情况下得到部分结果。

    【讨论】:

      猜你喜欢
      • 2020-04-09
      • 1970-01-01
      • 2013-05-10
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      相关资源
      最近更新 更多