代替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”和“}上的变量
但是您不能使用空指针来标记结束-我使用了一个空字符串,但是您可以简单地给出一个计数,而不是使用哨兵(空指针或空字符串)。