7

我是 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" */
4

4 回答 4

10

你可以试试:

char *str = malloc(cLen + 1);
memset(str, 'a', cLen);
str[cLen] = 0;
于 2012-09-10T13:26:02.633 回答
5

乍一看,C 中的字符串可能不像您想要的那样灵活。

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

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

因此,您准备好处理动态内存分配,包括

#include <stdlib.h>

声明一个指向字符的指针

char *cpString;

您要求分配“n”个字符

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

现在您可以strcat, printf对具有 n-1 个字符的字符串执行任何操作(因为它必须以空字符结尾)。具体来说,您现在可以使用

memset(cpString,X,n-1);
cpString[n]=0;

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

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

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

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

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

于 2012-09-10T13:38:40.240 回答
2

没有必要使用strncat(),字符串只是字符数组,所以直接逐个字符地进行赋值:

void repeated_string(char *out, size_t len, char v)
{
  for(; len > 0; --len)
    *out++ = v;
  *out = '\0';
}
于 2012-09-10T13:26:56.823 回答
1

您的代码有两个问题:

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';

之后,您的代码应该可以工作。

于 2012-09-10T13:45:31.017 回答