【问题标题】:How to dynamically allocate a string using function?如何使用函数动态分配字符串?
【发布时间】:2015-08-22 19:17:09
【问题描述】:

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

#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;
}

【问题讨论】:

标签: c string function pointers dynamic


【解决方案1】:

一些问题:

  1. 内存太小了。

  2. while(c!='\n') 第一次测试c,即使它未初始化。

  3. string() 应该像string(char **) 一样传递char * 的地址

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

次要:

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

  2. realloc() 每个循环肯定效率低下。

  3. malloc()/realloc() 的强制转换是不必要的。

  4. 很适合检查内存不足。

  5. 使用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;    
    }
    

【讨论】:

    【解决方案2】:

    您需要将引用传递给指针 (int string(char **str)),因为您要在函数内部更改 str 的值。

    main,你应该打电话给string(&amp;str)

    【讨论】:

      猜你喜欢
      • 2023-01-08
      • 2021-05-08
      • 2020-12-09
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多