【发布时间】: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