如何在C中自动定义字符串长度?

时间:2014-04-27 00:16:05

标签: c string

我试图在C中反转一个字符串。我在定义目标字符串时遇到了一些麻烦。

以下是我的想法:(我是初学者,所以我的想法在你眼中看起来很可笑......)

  1. 我定义了一个长度未知的字符串数据类型并为其指定了一个字符串。 (就我而言,它是str1)

  2. 我得到字符串1的字符串长度并递增该值并指定一个整数。 (在我的情况下。+ 1是为了补偿字符串末尾的' \ 0')

  3. 使用此l整数定义一个新字符串,该字符串是目标字符串。 (在我的情况下是str2。)

  4. 使用for循环从str1的末尾复制到str2的开头并添加' \ 0'到str2的末尾,使它成为一个字符串。

  5. 但是,当我尝试在visual studio 2013中执行此操作时,它不会让我编译。

    我附上了错误消息和代码。 (错误消息中的第15行是我用整数l定义str2的地方)

    我试着在整数l所在的地方插入一个数字(例如:100),代码可以工作。

    你能让我知道用一个整数变量定义一个字符串有什么问题吗?如果在C中有一个方法,怎么做呢,而不只是定义一个足够长的sting?

    谢谢!

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        /* Reversing a string! */
    
        int l; /* Length of str1 +1 (for the NULL character) */
    
        char str1[] = "This is an unknown length string!";
        l = strlen(str1) + 1;
    
        char str2[l]; /* The destination string */    
        int i, j;
    
    
        for (i = strlen(str1)-1,j=0; i < strlen(str1) && i >= 0; i--,j++)
            str2[j] = str1[i];
        str2[j] = '\0';
    
        /* Display str1 and str2 */
    
        printf("The content of str1: %s\n", str1);
        printf("The content of str2: %s\n", str2);
        return 0;
    }
    

    enter image description here

2 个答案:

答案 0 :(得分:1)

Visual Studio不支持混合类型声明和可变长度数组。您需要以C89样式声明所有变量,即main中代码的开头。并为str2动态分配空间。

size_t l; /* Length of str1 +1 (for the NULL character) */
int i, j;
char str1[] = "This is an unknown length string!";
l = strlen(str1) + 1;

char *str2;   
str2 = malloc(l);

答案 1 :(得分:1)

不需要动态内存分配的替代方案。它适用于这种情况,但它不是一般的解决方案(例如,您无法合理地使用它来反转任意数量的不同长度的字符串,而您可以使用malloc()free()处理那个)。您的原始代码使用VLA - 可变长度数组 - 这是C99中的标准数据,可选择在C11中支持。

#include <stdio.h>

int main(void)
{
    /* Reversing a string! */
    char str1[] = "This is an unknown length string!";
    char str2[sizeof(str1)];
    int len = sizeof(str1);
    int i, j;

    for (i = len - 2, j = 0; i >= 0; i--, j++)
        str2[j] = str1[i];
    str2[j] = '\0';

    /* Display str1 and str2 */
    printf("The content of str1: %s\n", str1);
    printf("The content of str2: %s\n", str2);
    return 0;
}