Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C语言中自动定义字符串长度?_C_String - Fatal编程技术网

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

如何在C语言中自动定义字符串长度?,c,string,C,String,我试图在C中反转字符串,但在定义目标字符串时遇到了一些问题 以下是我的想法:(我是一个初学者,所以我的想法在你看来可能很可笑…) 我定义了一个长度未知的字符串数据类型,并为其分配了一个字符串。(在我的例子中是str1) 我得到字符串1的字符串长度,增加这个值,然后分配给一个整数。(在我的例子中为l,+1用于补偿字符串末尾的“\0”) 使用此l整数定义作为目标字符串的新字符串。(在我的例子中是str2。) 使用for循环从str1的结尾复制到str2的开头,并在str2的结尾添加“\0”使其成为字

我试图在C中反转字符串,但在定义目标字符串时遇到了一些问题

以下是我的想法:(我是一个初学者,所以我的想法在你看来可能很可笑…)

  • 我定义了一个长度未知的字符串数据类型,并为其分配了一个字符串。(在我的例子中是str1)

  • 我得到字符串1的字符串长度,增加这个值,然后分配给一个整数。(在我的例子中为l,+1用于补偿字符串末尾的“\0”)

  • 使用此l整数定义作为目标字符串的新字符串。(在我的例子中是str2。)

  • 使用for循环从str1的结尾复制到str2的开头,并在str2的结尾添加“\0”使其成为字符串

  • 然而,当我在visual studio 2013中尝试这样做时,它不允许我编译

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

    我试着在整数l所在的位置输入一个数字(例如:100),代码就可以运行了

    你能告诉我用整型变量定义字符串有什么错吗?如果在C语言中有办法的话,怎么做,而不是仅仅定义一个足够长的字符串

    谢谢大家!

    #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;
    }
    
    #包括
    #包括
    int main()
    {
    /*倒弦*/
    int l;/*str1+1的长度(对于空字符)*/
    char str1[]=“这是长度未知的字符串!”;
    l=strlen(str1)+1;
    char str2[l];/*目标字符串*/
    int i,j;
    对于(i=strlen(str1)-1,j=0;i=0;i--,j++)
    str2[j]=str1[i];
    str2[j]='\0';
    /*显示str1和str2*/
    printf(“str1的内容:%s\n”,str1);
    printf(“str2的内容:%s\n”,str2);
    返回0;
    }
    

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

    一种不需要动态内存分配的替代方案。它在这种情况下工作,但它不是一个通用的解决方案(例如,您不能明智地使用它来反转任意数量的不同长度的字符串,而您可以使用
    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;
    }
    
    #包括
    内部主(空)
    {
    /*倒弦*/
    char str1[]=“这是长度未知的字符串!”;
    字符str2[sizeof(str1)];
    int len=sizeof(str1);
    int i,j;
    对于(i=len-2,j=0;i>=0;i--,j++)
    str2[j]=str1[i];
    str2[j]='\0';
    /*显示str1和str2*/
    printf(“str1的内容:%s\n”,str1);
    printf(“str2的内容:%s\n”,str2);
    返回0;
    }
    
    使用
    size\u t
    而不是
    int
    ,因为数组长度更便于携带。别忘了
    免费(str2)使用此技术。诚然,在一个即将退出的程序中,这并不重要,但最好从一开始就养成良好的习惯,在不再需要时释放分配的内存肯定是一个好习惯。