如何在C中创建一个带有字符X的可变长度字符串

rec*_*nja 5 c string loops initialization

我是C的新手,我遇到了一些麻烦.如何在C中创建包含指定字符的可变长度字符串?这是我尝试过但我收到编译器错误:

int  cLen     = 8    /* Specified Length    */ 
char chr      = 'a'; /* Specified Character */
char outStr[cLen];
int  tmp      = 0;
while (tmp < cLen-1)
  outStr[tmp++] = chr;

outStr[cLen-1] = '\0';

/* outStr = "aaaaaaaa" */
Run Code Online (Sandbox Code Playgroud)

cni*_*tar 8

你可以试试:

char *str = malloc(cLen + 1);
memset(str, 'a', cLen);
str[cLen] = 0;
Run Code Online (Sandbox Code Playgroud)

  • '\ 0'而不是0会使它变得完美. (7认同)

jpi*_*912 5

乍一看,C 中的字符串可能没有您想要的那么灵活。

你对 "char outStr[]" 所做的是表明你想要一个指向 char 的指针,它可以用数组语法迭代......它没有为字符创建实际存储,因为你从未提到你想要多少储藏。

在 C 中,您可以将存储与这些称为指针的特殊变量分离。想要一个可变长度字符串的例子实际上是一个很好的例子,说明你为什么想要它:我想要一个实体,它知道存储在哪里;我想要允许我更改存储大小的方法。

因此,您准备好通过包括以下内容来处理动态内存分配

#include <stdlib.h>
Run Code Online (Sandbox Code Playgroud)

声明一个指向字符的指针

char *cpString;
Run Code Online (Sandbox Code Playgroud)

您要求分配“n”个字符

cpString=malloc(n*sizeof(char));
Run Code Online (Sandbox Code Playgroud)

现在您可以strcat, printf,无论您想对具有 n-1 个字符的字符串做什么(因为它必须以空字符结尾)。具体来说,您现在可以使用

memset(cpString,X,n-1);
cpString[n]=0;
Run Code Online (Sandbox Code Playgroud)

它创建了一个 XXXX...XXX\0 字符串,包含 n-1 个字符。

当您想更改 cpString 存储大小时,这是棘手的部分,您需要在请求新的存储分配之前释放分配的内存

if (cpString !=0)
{
 free(cpString);
 cpString=0;
}
cpString=malloc(n*sizeof(char));
Run Code Online (Sandbox Code Playgroud)

否则,动态内存存储区域(称为“堆”)会留下一块不可回收的旧 n 大小。

有更好的分配器,不需要 free(),但我最好让你学习和练习 malloc() free() 用法。