今天早些时候我问了一个关于我得到的valgrind错误的问题,因为我没有解决方案,我将不得不尝试以另一种方式找到解决方案。
int login(char* input, int input_length)
这是我有atm的函数原型。 我将得到一个输入,应该是base64编码,所以我解码它(该函数工作并生成没有错误)并将返回的char *保存到一个新的char *(函数calloc&#39的内存返回) 。
理想情况下,结束返回(如果用户输入的格式正确)应该如下所示
username:password
我如何可靠地找到':'并在2个不同的char *指针中复制用户名和密码。我知道我必须动态(取决于两者的长度)分配内存。我也知道如何获取用户名,粗略代码:
int temp;
char* username;
char* buffer;
buffer = strchr(input, ':');
temp = strlen(input) - strlen(buffer);
username = calloc(temp, sizeof(char));
strncpy(username, input, temp);
现在缓冲区指的是':'我不知道char会跟着什么,如果有的话。我现在怎么能在没有未经传播的变量风险的情况下获得密码?
旁注:我将检查输入是否为NULL,如果为NULL,则检查已解码的char *,如果两者为真,则该函数以返回结束。
char* decoded = NULL; //So it doesn't point to memory i don't "own"
if(input != NULL) {
decoded = base64_decode(input, input_length);
}
passlocation = strchr(decoded, ':');
答案 0 :(得分:2)
您需要复制null
终止符,并将其添加到遗漏的位置。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stddef.h>
int
main(void)
{
const char *input = "user:password";
char *separator;
char *user;
char *password;
size_t length;
separator = strchr(input, ':');
if (separator == NULL) // No separator
return -1;
// Compute the length using pointer arithmetic
length = (ptrdiff_t) (separator - input);
if (length == 0) // Separator is the first character
return -1;
user = malloc(length + 1);
if (user == NULL) // Cannot allocate memory
return -1;
user[length] = '\0'; // Always Remember the `null` terminator
memcpy(user, input, length);
password = strdup(separator + 1);
if (password != NULL)
fprintf(stdout, "User: %s\nPassword: %s\n", user, password);
free(password);
free(user);
return 0;
}