代替malloc
将以下功能代替malloc,c,C,将以下功能赋予\u lower: #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> void to_lower(char ** strings) { char * original_string, lower_string; for (int i=0; (original_string=strings[i]) != NULL;
赋予\u lower
:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
void to_lower(char ** strings) {
char * original_string, lower_string;
for (int i=0; (original_string=strings[i]) != NULL; i++) {
lower_string = malloc(strlen(original_string)+1);
for (int j=0; j<=strlen(original_string); j++)
lower_string[j] = tolower(original_string[j]);
strings[i]=lower_string;
}
}
int main(void) {
char * strings[] = {"Hello", "Zerotom", "new", NULL };
to_lower(strings);
}
#包括
#包括
#包括
#包括
从空到低(字符**字符串){
char*原始_字符串,较低_字符串;
for(int i=0;(原始字符串=strings[i])!=NULL;i++){
下字符串=malloc(strlen(原始字符串)+1);
对于(int j=0;j,正如注释中指出的,您的两个问题是您打算更改常量字符串文本,并且您的函数行为依赖于数据结构的属性(即正确终止的字符串和作为最后一个元素的空指针)
因此,我建议在启动时设置一个固定大小的数据结构,然后设置和更改内容,最后再次清理所有内容,如下所示:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#define LEN 10
#define NUM 3
char **init (int num, int len) {
char **strings = calloc(num, sizeof(char*));
for (int i=0; i < num; i++) {
strings[i] = calloc(len, sizeof(char));
}
return strings;
}
void teardown (char **strings, int num) {
for (int i=0; i < num; i++) {
free(strings[i]);
}
free(strings);
}
void to_lower(char **strings, int num, int len) {
for (int i=0; i < num; i++) {
for (int j=0; j < len; j++)
strings[i][j] = tolower(strings[i][j]);
}
}
int main(void) {
// startup
char **strings = init(NUM, LEN);
// do things
sprintf(strings[0], "%s", "Hello");
sprintf(strings[1], "%s", "Zerotom");
sprintf(strings[2], "%s", "new");
to_lower(strings, NUM, LEN);
// shutdown
teardown(strings, NUM);
return 0;
}
#包括
#包括
#包括
#包括
#定义LEN 10
#定义NUM 3
字符**init(int num,int len){
char**strings=calloc(num,sizeof(char*));
for(int i=0;i
strlen(原始字符串+1)
不正确。它应该是(strlen(原始字符串)+1)
简单的答案是“否”重写文本字符串将调用未定义的行为,因此必须分配新的内存。当然,如果指针的输入数组指向malloc
ed内存,则此例程会泄漏。因此,更大的答案是函数的语义是脆弱的。最好避免对输入进行任何变异。Allo提供一个新的指针数组和新字符串,并将其与调用方负责释放整个shebang的契约一起返回。@Gene--感谢您的输入。您能演示一下在实践中是如何做到的吗?@Shared您向函数传递了一组指向字符串常量的指针。根据定义,常量是不能修改的。如果希望函数修改指针指向的对象,指针不能指向常量。您可以使用char strings[][20]={“Hello”、“Zerotom”、“new”和“}上的变量
但是您不能使用空指针来标记结束-我使用了一个空字符串,但是您可以简单地给出一个计数,而不是使用哨兵(空指针或空字符串)。