复制字符串而不知道大小

时间:2011-04-08 05:55:46

标签: c arrays

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

例如:

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

   strcopy(newString, string);
}

5 个答案:

答案 0 :(得分:4)

在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);
}

答案 1 :(得分:3)

是的,有:

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

这适用于任何版本的C甚至回到v6 Unix(1975)。

答案 2 :(得分:1)

我想这是一个以null结尾的字符串。因此,您可以使用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);
}

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

我在C中只做了一点,但我想从内存中获取字符串的大小,我认为你可以做到。其中一件作品确定无疑。 (如果我错了,不要反对我:/)

sizeof(newString)

sizeof(newString) / sizeof(*newString)