【问题标题】:C Set Array size by strlen()C 通过 strlen() 设置数组大小
【发布时间】:2020-10-16 22:26:08
【问题描述】:

在 C 而不是 C++ 中,我尝试使用包含在 const int 中的 strlen() 来设置 char 数组大小。

char *input = "hello";

//now the integer that contains the lenght
static const int lengthA = strlen(input); //upto here, it works

char list_array[lengthA]; //here doesn't work, because the variable lengthA is not initialized

所以,我希望 input 的长度用作 array 的长度。

我已经尝试使用 sizeof,而不是 strlen,但它返回字节

这可能吗?

【问题讨论】:

  • 如果您的编译器支持可变长度数组,那么提供的代码是有效的,前提是关键字 static 将被删除为常量 lengthA。
  • 这段代码到底发生了什么?如果有的话,您会收到哪些错误消息?另外,你用的是什么编译器?是偶然的 MSVC 吗?
  • 我正在使用 VS,错误是“错误 C2131:表达式未计算为常量”。但微软网站对我没有帮助。
  • 请记住,strlen("hello") 字符数组不足以容纳字符串 "hello"。如果要将字符串"hello" 存储在list_array 中,则需要为'\0' 终止符再分配一个字节。 (您可以将字符'h', 'e', 'l', 'l', 'o' 存储在5 个字节中,但是list_array 的内容将不是字符串,并且对其应用的任何字符串操作都将是未定义的。)
  • 请编辑您的问题以包含错误消息

标签: arrays c pointers char string-length


【解决方案1】:

您使用的功能称为可变长度数组,其中数组的大小在运行时确定。但是,Visual Studio 不支持此功能。

您需要使用malloc 动态分配内存:

char *input = "hello";
static const int lengthA = strlen(input);
char *list_array = malloc(lengthA); 

【讨论】:

  • 可变长度数组在 C90 中不存在,在 C99 中是必需的,在 C11 中是可选的。 Microsoft 最近宣布了 C11 对 Visual Studio 的支持,但他们不打算支持 VLA。如果您愿意,请随时将此添加到您的答案中。
【解决方案2】:
  1. 使用正确的类型。 strlen 返回 size_t 不是 int
  2. 您只能使用常量表达式初始化静态和全局变量。您不能使用任何函数调用或变量来初始化它们。
  3. 您可以使用非常量表达式来初始化和定义自动变量。
char *input = "hello";
char input1[] = "hello";

static const size_t lengthA = sizeof(input1); 

char list_array[sizeof(input1)];


void foo(void)
{
    const size_t lengthA = strlen(input); 
    char listArray[lengthA + 1];  
}

在局部变量的定义中结点+1。您需要它来容纳字符串以及终止空字符

【讨论】:

    【解决方案3】:

    请试试这个。

    char *list_array = calloc(lengthA, sizeof(char));
    

    【讨论】:

    • 它也不适用于静态存储变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多