【问题标题】:How to make a dynamic char?如何制作动态字符?
【发布时间】:2018-05-20 06:54:28
【问题描述】:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void generarCadena(char *);
void generarDimension(int, void **, int);
void reallocarDimensiones(int , void **, int);

int main(void){
    char *caracter=NULL;
    generarCadena(&caracter);
    printf("%d", sizeof(caracter));
    printf("%s", &caracter);//I want to now why this doesn't print
    return 0;
}

void generarCadena(char *scaneado){
    unsigned int cont;
    char lector;
    generarDimension(1,&scaneado,sizeof(char));
    cont = 0;
    while(!scanf("%s", &scaneado)){
        while((strcpy(lector,getchar())) !='\n' && lector!=EOF){
           reallocarDimensiones(1,&scaneado[cont],sizeof(char));
           cont++;
        }
    }
    printf("%s", &scaneado);/*Inside de function it prints, 
    however, it doesn't print outside it*/
}//This function is for the dynamic char

void generarDimension(int bloques, void **ptr, int tamanho){
    *ptr = malloc(bloques * tamanho);
    if(*ptr==NULL){
        printf("No se pudo almacenar memoria\n");
    }
}//This function mallocs any given pointer
void reallocarDimensiones(int bloques, void **ptr, int tamanho){
    *ptr = realloc(*ptr,bloques * tamanho);
    if(*ptr==NULL){
        printf("No se pudo almacenar memoria\n");
    }
}//This function reallocs any given pointer

嗨,我现在想知道如何在将字符写入键盘时动态存储它,所以我为它制作了一个函数。我想在其中发送一个 char 指针,但它似乎没有修改它。我遇到的另一个问题是我的函数只存储了一些数据,所以如果数据太长,我的程序就会崩溃。

【问题讨论】:

  • printf("%s", &amp;caracter); -->> 地址不是字符串。如果你想打印变量或指针的地址,或者任何 C 语言的地址,你应该在printf() 中使用%p%s 格式说明符专门用于字符串。
  • *ptr = realloc(*ptr,bloques * tamanho); 这通常是个坏主意。始终使用临时的,检查NULL 然后分配。否则你可能有泄漏。
  • @AjayBrahmakshatriya 谢谢你的建议!
  • scanf("%s", &amp;scaneado) --> scanf("%s", scaneado).
  • reallocarDimensiones(1,&amp;scaneado[cont],sizeof(char)); -- 这是怎么回事? &amp;scaneado[cont] 是指向 char 的指针,但 reallocarDimensiones() 接受 void ** 参数。

标签: c pointers dynamic char


【解决方案1】:

这将代码简化为一个函数来捕获输入直到换行。内存分配给每个字符。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char *generarCadena(char *);

int main(void){
    char *caracter=NULL;//so realloc will operate as malloc on first call
    caracter = generarCadena ( caracter);
    printf("%zu\n", sizeof(caracter));
    if ( caracter) {//something was input
        printf("%s\n", caracter);
        free ( caracter);
    }
    return 0;
}

char *generarCadena(char *scaneado){
    char *temp = NULL;
    int in = 0;
    size_t size = 0;

    while ( '\n' != ( in = getchar ( ))) {//loop until newline
        if ( NULL == ( temp = realloc ( scaneado, size + 2))) {//realloc for each character input and '\0'
            fprintf ( stderr, "realloc problem\n");
            return scaneado;
        }
        scaneado = temp;
        scaneado[size] = in;//set input
        scaneado[size + 1] = '\0';//terminate
        size++;
    }
    return scaneado;
}

【讨论】:

    【解决方案2】:

    我发现这里有问题:

    printf("%s", &caracter);//I want to now why this doesn't print
    

    caracter 是一个char 指针。通过将&amp;caracter 一起使用,您将尝试访问char 指针的地址,而不是指针指向的内容。

    改成

    printf("%s", caracter);
    

    其次,lector 在使用前被初始化成什么?见这里:

    while((strcpy(lector,getchar())) !='\n' && lector!=EOF)
    

    【讨论】:

    • 对于您指出的第一件事,我首先没有使用“&”,但是由于某种原因它甚至不会打印它。对于您指出的第二件事,它确实需要是一个双指针,因为它是一个 void 指针,否则它不起作用。你可以运行我的代码,它确实可以运行。如果你修改这些部分,你会看到。
    • @user8863098:是的,我同意我在使用双指针时弄错了,这就是为什么我从答案中删除了那部分。
    • “它确实运行” 并不意味着“它是正确的或定义明确的”。
    • @underscore_d 我没说它有效。我只是准确地说它“运行”。如果它有效,我不会寻求帮助 LOL
    • @user8863098 -- underscore_d 没有说你说它有效。发布的代码运行毫无意义;它充满了未定义的行为,这就是“并不意味着'它是正确或定义明确'”的意思。
    猜你喜欢
    • 2020-11-02
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2021-11-25
    • 2019-11-10
    • 1970-01-01
    • 2016-09-18
    相关资源
    最近更新 更多