gpt4 book ai didi

c - 如何使用函数动态分配字符串?

转载 作者:行者123 更新时间:2023-11-30 20:01:27 26 4
gpt4 key购买 nike

我试图通过接受用户的动态字符串来分配它。我想用一个函数来做到这一点。我正在尝试实现以下代码,但它无法正常工作。

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

int string(char *str)
{
char c;
int i=0,j=1;
str = (char*)malloc(sizeof(char));

printf("Enter String : ");
while(c!='\n')
{
c = getc(stdin); //read the input from keyboard standard input
//re-allocate (resize) memory for character read to be stored
*str = (char*)realloc(str,j*sizeof(char));
*str[i] = c; //store read character by making pointer point to c
i++;
j++;
}
str[i]='\0'; //at the end append null character to mark end of string
printf("\nThe entered string is : %s",str);
return j;
}


int main()
{
int len;
char *str=NULL;
len=string(str);
printf("\nThe entered string is : %s and it is of %d length.",str,len);
free(str);
return 0;
}

最佳答案

一些问题:

  1. 内存大小太小。

  2. while(c!='\n') 首先测试 c,即使它尚未初始化。

  3. string() 应传递 char * 的地址,如 string(char **)

  4. 使用 strlen() 时,最好使用 size_t 而不是 int

次要:

  • 未检测到 EOF。使用 int c 而不是 char c 来帮助检测。

  • 每个循环的 realloc() 效率肯定很低。

  • 不需要malloc()/realloc()转换。

  • 很高兴检查内存是否不足。

  • 为了可移植性,使用 int main(void) 而不是 int main()

    size_t string(char **str) {
    assert(str);
    int c;
    size_t i = 0;
    size_t size = 0;
    *str = NULL;

    printf("Enter String : ");
    while((c = getc(stdin)) !='\n' && c != EOF) {
    if (i == size) {
    size *= 2 + 1; // double the size each time
    *str = realloc(*str, size);
    assert(*str);
    }
    (*str)[i] = c; // store read character by making pointer point to c
    i++;
    }
    *str = realloc(*str, i+1); // right-size the string
    assert(*str);
    (*str)[i] = '\0'; // at the end append null character to mark end
    printf("\nThe entered string is : %s",*str);
    return i;
    }
  • 关于c - 如何使用函数动态分配字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32159872/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com