我是 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" */
你可以尝试:
char *str = malloc(cLen + 1);
memset(str, 'a', cLen);
str[cLen] = '\0';
(已编辑以正确地以 ' ' 终止字符串)
乍一看,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() 的用法。
不需要使用
strncat()
,字符串只是字符数组,所以直接逐个字符进行赋值:
void repeated_string(char *out, size_t len, char v)
{
for(; len > 0; --len)
*out++ = v;
*out = '\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';
之后你的代码应该可以工作了。