- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要编写一个函数,该函数将从 HTTP 1.0 中的授权 header 获取 base64 字符串。因此,我写了这个函数:
char* getAuthenticate(char* buffer) {
const char* AuthorizationLine = calloc(1, sizeof(char));
char* BasePtr;
char* CodePtr = calloc(1, sizeof(char));
//Get Authoriztaion Header
if(strstr(buffer, "Authorization: ") != NULL) {
AuthorizationLine = strstr(buffer, "Authorization: ");
char Copy[strlen(AuthorizationLine)];
strcpy(Copy, AuthorizationLine);
AuthorizationLine = strtok(Copy, "\r\n");
}
else {
printf("Error - no valid Authorization Header");
return NULL;
}
//Set CodePtr to the base64 String
CodePtr = strrchr(AuthorizationLine, " ");
CodePtr = CodePtr +1;
return CodePtr;
}
通过在调试器中运行此函数,我发现在到达 CodePtr 部分之前一切都很好。一旦我执行CodePtr = strstr(AuthorizationLine, " ")
,我的授权行将充满废话,例如“\020Õÿÿÿ\177”。还有CodePtr
甚至不受影响:它的地址仍然是 0x0
直到我这样做+1
,但那就只有 0x1
并且 Eclipse 无法访问该地址处的内存。
那我做错了什么?我也尝试过strstr()
,但也没有成功。
最佳答案
你的函数泄漏了内存。它为一个 char
分配空间,并将指向该空间的指针分配给变量 AuthorizationLine
,但随后为 AuthorizationLine
分配一个新值,而不释放分配的内存。您似乎不需要在这里分配任何内存。
您没有声明数组Copy
足够大。您还需要为字符串终止符留出空间。因此,当您复制到该数组时,您会得到未定义的行为。
您将 AuthorizationLine
设置为指向数组 Copy
部分的指针,但该 Copy
之后立即超出范围,留下 AuthorizationLine
无效指针。
很有可能,strrchr()
(或strstr()
)会覆盖 AuthorizationLine
指向的任何内存(堆栈上的某个位置)其局部变量的值。 strrchr()
返回一个 NULL 指针,因为当找不到指定的字符时它会执行此操作。
此外,您还返回一个指向局部变量的指针。这与 Copy
超出范围时出现的问题相同。
更新:
这个版本可以解决问题。请注意,它返回一个指向已分配内存的指针,调用者有义务在不再需要时释放该内存。
char* getAuthenticate(char* buffer) {
/* Get Authoriztaion Header */
const char* AuthorizationLine = strstr(buffer, "Authorization: ");
if (AuthorizationLine) {
/* extract the authorization token */
char* EndPtr = strstr(AuthorizationLine, "\r\n");
char* CodePtr;
if (!EndPtr) {
/* the header is the last thing in the buffer */
EndPtr = AuthorizationLine + strlen(AuthorizationLine) - 1;
}
/* ignore trailing whitespace */
while (isspace(*EndPtr)) {
EndPtr -= 1;
}
/* find the start of the authorization token */
for (CodePtr = EndPtr; !isspace(*CodePtr); CodePtr -= 1 ) {
if (CodePtr == AuthorizationLine) {
printf("Error - invalid authorization header\n");
return NULL;
}
}
/* allocate space and copy the token into it */
ptrdiff_t value_length = ++EndPtr - CodePtr++;
char *Copy = malloc(value_length + 1);
if (Copy) {
strncpy(Copy, CodePtr, value_length);
Copy[value_length] = '\0';
} else {
printf("Error - memory allocation failure\n");
}
return Copy;
} else {
printf("Error - no Authorization Header\n");
return NULL;
}
}
关于c - strrchr() 只会改变干草堆并忽略针,并且不会返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30811537/
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我只是尝试编写一个小函数来使用 strrchr() (string.h) 获取文件的扩展名 (char * file)。但是,我有一个问题,这个函数会导致内存损坏错误(我不知道确切的原因)。 我已经检
我用 strrchr 得到了一些奇怪的结果。请帮助我。 这是我的代码: #include #include #include int main() { char szString[32] =
我需要编写一个函数,该函数将从 HTTP 1.0 中的授权 header 获取 base64 字符串。因此,我写了这个函数: char* getAuthenticate(char* buffer) {
我正在尝试从记录中删除最后一个逗号。我使用 strrchr() 查找记录中最后一次出现的“,”并将其设置为空终止符。由于某种原因,它没有找到最后一次出现的逗号并给出“段错误 11”错误。 void b
这是我的程序,它反转了一个字符串。我试图在最后使用函数 strrchr,因为我在标准输入中输入字符串 James Bond。所以我想看看 strrchr 函数是否给出了一个指向上述字符串的值字符 B
我正在用函数 strrchr 做一些测试,但我无法理解输出: $text = 'This is my code'; echo strrchr($text, 'my'); //my code 好的,函数
使用 C 字符串,我将编写以下代码以从文件路径获取文件名: #include const char* filePath = "dir1\\dir2\\filename"; // example //
php中strstr、strrchr、substr、stristr四个函数用法区别: php中strstr strrchr substr stristr这四个字符串操作函数特别让人容易混淆,常用的
1、取部份字符串。 复制代码 代码如下: string substr(string string, int start, int [length]);
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
出于某种原因,每当我试图在字节字符串的末尾找到斜杠(在本例中,base_url 设置为“www.google.com/”)时,它似乎不想返回它存在或不存在。但是,如果我将 base_url 更改为类似
我觉得这应该是一件容易的事,但我一直收到段错误。我正在尝试查找最后一次出现的字符“/”,然后在该字符后打印一个字符。 这主要是为了打印出一个文件,这样: directory1/directory2/h
对于家庭作业,我必须在 string.h 中实现 22 个函数。我正在努力实现 strrchr,但在尝试复制生成的匹配字符串时遇到了一些问题。 这是我目前尝试实现它的尝试: char *new_str
函数 char* strrchr(const char *str, int ch) 返回 char* 内的指针 ( str ) ( const char * ) 最后一次出现 ch 的地方位于。 所以
这个问题在这里已经有了答案: Is C NULL equal to C++11 nullptr (1 个回答) 关闭 5 年前。 我正在将程序从 C 移植到 C++,包括以下代码: char* ge
我正在尝试编译一些别人告诉我可以正常编译的代码。也许在不同的编译器上。我正在使用 VS2010,并且有以下行: char *dot = strrchr(filename, '.'); 这会导致编译器错
我是一名优秀的程序员,十分优秀!