繁体   English   中英

复制字符串而不知道大小

[英]Copy string without knowing size

有没有一种方法可以在不知道新数组在编译时必须达到的大小的情况下将字符串复制到新字符串中? 据我所知,在C语言中不能有可变的数组长度。

例如:

void myFunction(char *string)
{
   char newString[????];

   strcopy(newString, string);
}

在C99中,可变长度数组是一个选项:

void myFunction(char *string)
{
   char newString[strlen(string) + 1];

    // note: strcpy, not strcopy
   strcpy(newString, string);
}

但是,如果字符串很大,就会遇到问题; 它会耗尽您的堆栈空间和kaboom! (此外,数组像任何局部变量一样在其作用域的结尾处不复存在,因此无法返回它。)

因此,除非您知道字符串很小,否则最好只动态分配:

void myFunction(char *string)
{
   char *newString = strdup(string);
   if (!newString) /* error */

   /* ... */

   free(newString);
}

就在这里:

void myFunction(char *string)
{
   char *newString = strdup (string);
   ... (make use of newString) ...
   free (newString);
}

它适用于任何版本的C,甚至可以追溯到v6 Unix(1975)。

我想这是一个以空值结尾的字符串。 因此,您可以使用strlen()获得字符串的大小。 因此,您可以执行以下操作:

void myFunction(char *string)
{
   int len;
   char* newString;

   len = strlen(string);
   newString = (char*)malloc(len+1); // space for null termination too

   strcpy(newString, string);
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <error.h>

typedef struct
{
   int ii;
   double dd;
} SSS;

int main()
{
   int kk, jj;

   char *str1="This is a text string";
   char *str2 = malloc(strlen(str1));

   SSS *s1 = calloc(4, sizeof(SSS));
   if(s1 == ENOMEM) printf("Error ENOMEM: Insufficient memory available\n");

   strcpy(str2,str1); /* Make a copy of the string */

   for(kk=0; kk < 5; kk++)
   {
      s1[kk].ii=kk;
   }

   for(jj=0; jj < 5; jj++)
   {
      printf("Value strored: %d\n",s1[jj].ii);
   }

   free(s1);
   free(str2);
}

我只用C做过一点,但是我认为从内存中获取一个字符串的大小我想您都可以。 这些作品之一肯定。 (如果我错了,请不要反对我:/)

sizeof(newString)

要么

sizeof(newString) / sizeof(*newString)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM