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

问题描述 投票:0回答:4

我是 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" */
c string loops initialization
4个回答
10
投票

你可以尝试:

char *str = malloc(cLen + 1);
memset(str, 'a', cLen);
str[cLen] = '\0';

(已编辑以正确地以 ' ' 终止字符串)


4
投票

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

您对“char outStr[]”所做的事情是表明您想要一个指向 char 的指针,可以使用数组语法对其进行迭代...它没有为字符创建实际存储,因为您从未提到过要多少个字符喜欢储存。

在 C 中,您可以将存储与这些特殊变量(称为指针)解耦。想要一个可变长度字符串的例子实际上是一个很好的例子,说明了为什么你会想要这样: 我想要一个拥有存储位置信息的实体;我想要允许我更改存储大小的方法。

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

#include <stdlib.h>

通过

声明指向字符的指针
char *cpString;

您要求分配“n”个字符

cpString=malloc(n*sizeof(char));

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

初始化字符串
memset(cpString,X,n-1);
cpString[n]=0;

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

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

if (cpString !=0)
{
 free(cpString);
 cpString=0;
}
cpString=malloc(n*sizeof(char));

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

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


1
投票

不需要使用

strncat()
,字符串只是字符数组,所以直接逐个字符进行赋值:

void repeated_string(char *out, size_t len, char v)
{
  for(; len > 0; --len)
    *out++ = v;
  *out = '\0';
}

0
投票

您的代码有两个问题:

1)长度(可能)不是你所期望的。你有:

int cLen = 8; /* Specified Length */

假设您想要一个长度为 8 的字符串。因为您必须添加一个 NULL 终止符,所以您现在只能得到一个长度为 7 的字符串。如果这就是您想要的,您应该更新您的评论以明确这一点:

int cLen = 9; /* Specified Length (8) + 1 for NULL */

2)您没有正确分配字符:

char chr = "a";

不对。字符用单引号指定:

char chr = 'a';

之后你的代码应该可以工作了。

© www.soinside.com 2019 - 2024. All rights reserved.