Tôi có một hàm chuỗi chấp nhận một con trỏ tới một chuỗi nguồn và trả về một con trỏ đến một chuỗi đích. Chức năng này hiện đang hoạt động, nhưng tôi lo lắng rằng tôi không tuân theo phương thức thực hành tốt nhất là malloc, realloc và miễn phí.thực hành tốt nhất để trả về một chuỗi có độ dài thay đổi trong c
Điều khác biệt về hàm của tôi là độ dài của chuỗi đích không giống như chuỗi nguồn, vì vậy realloc() phải được gọi bên trong hàm của tôi. Tôi biết từ nhìn vào tài liệu ...
http://www.cplusplus.com/reference/cstdlib/realloc/
rằng địa chỉ bộ nhớ có thể thay đổi sau khi realloc. Điều này có nghĩa là tôi không thể "vượt qua tham chiếu" như một lập trình viên C có thể cho các chức năng khác, tôi phải trả về con trỏ mới.
Vì vậy, các nguyên mẫu cho chức năng của tôi là:
//decode a uri encoded string
char *net_uri_to_text(char *);
Tôi không thích cách tôi đang làm điều đó bởi vì tôi phải giải phóng con trỏ sau khi chạy chức năng:
char * chr_output = net_uri_to_text("testing123%5a%5b%5cabc");
printf("%s\n", chr_output); //testing123Z[\abc
free(chr_output);
Có nghĩa là malloc() và realloc() được gọi bên trong hàm của tôi và hàm free() được gọi bên ngoài hàm của tôi.
Tôi có một nền tảng về ngôn ngữ cấp cao, (perl, plpgsql, bash) để bản năng của tôi là đóng gói thích hợp của những việc như vậy, nhưng điều đó có thể không phải là thực hành tốt nhất trong C.
Câu hỏi đặt ra: Liệu tôi cách thực hành tốt nhất, hoặc là có một cách tốt hơn tôi nên làm theo?
đầy đủ ví dụ
biên dịch và chạy với hai cảnh báo trên argc và argv đối số không sử dụng, bạn có thể yên tâm bỏ qua những cảnh báo hai.
example.c:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char *net_uri_to_text(char *);
int main(int argc, char ** argv) {
char * chr_input = "testing123%5a%5b%5cabc";
char * chr_output = net_uri_to_text(chr_input);
printf("%s\n", chr_output);
free(chr_output);
return 0;
}
//decodes uri-encoded string
//send pointer to source string
//return pointer to destination string
//WARNING!! YOU MUST USE free(chr_result) AFTER YOU'RE DONE WITH IT OR YOU WILL GET A MEMORY LEAK!
char *net_uri_to_text(char * chr_input) {
//define variables
int int_length = strlen(chr_input);
int int_new_length = int_length;
char * chr_output = malloc(int_length);
char * chr_output_working = chr_output;
char * chr_input_working = chr_input;
int int_output_working = 0;
unsigned int uint_hex_working;
//while not a null byte
while(*chr_input_working != '\0') {
//if %
if (*chr_input_working == *"%") {
//then put correct char in
sscanf(chr_input_working + 1, "%02x", &uint_hex_working);
*chr_output_working = (char)uint_hex_working;
//printf("special char:%c, %c, %d<\n", *chr_output_working, (char)uint_hex_working, uint_hex_working);
//realloc
chr_input_working++;
chr_input_working++;
int_new_length -= 2;
chr_output = realloc(chr_output, int_new_length);
//output working must be the new pointer plys how many chars we've done
chr_output_working = chr_output + int_output_working;
} else {
//put char in
*chr_output_working = *chr_input_working;
}
//increment pointers and number of chars in output working
chr_input_working++;
chr_output_working++;
int_output_working++;
}
//last null byte
*chr_output_working = '\0';
return chr_output;
}
Tôi thích phần '*"% "'. : D –
Cảm ơn, tôi chỉ phát hiện ra rằng ''%'' hoạt động. :) – Michael
Nếu bạn quấn mã của bạn giữa các dấu gạch chéo ngược ('), thì chúng sẽ được định dạng là mã –