以下代码怎样改正(C语言字符串问题)
 #define STDC_WANT_LIB_EXT1 1
#include <stdio.h>
#include <string.h>

int main(void)
{
    char preamble[] = "The joke is:\n\n";
    char str[][40] = {
                        "My dog has\'t got any nose.",
                        "How does your dog smell then?\n",
                        "My dog smells horrible.\n"
    };
    unsigned int strCount = sizeof(str) / sizeof(str[0]);

    unsigned int length = 0;
    for (unsigned int i = 0; i < strCount; ++i)
    {
        length += strnlen_s(str[i], sizeof(str[i]));
    }

    **char joke[length + strnlen_s(preamble, sizeof(preamble)) + 1];**

    if (strncpy_s(joke, sizeof(joke), preamble, sizeof(preamble)))
    {
        printf("Error copying preamble to joke.\n");
        return 1;
    }

    for (unsigned int i = 0; i < strCount; ++i)
    {
        if (strncat_s(joke, sizeof(joke), str[i], sizeof(str[i])))
        {
            printf("Error copying string str[%u].", i);
            return 2;
        }
    }
    printf("%s", joke);
    return 0;


}



错误信息:
1>f:\code\c语言入门经典\字符串和文本的应用\joining_strings.c(21): error C2057: 应输入常量表达式
1>f:\code\c语言入门经典\字符串和文本的应用\joining_strings.c(21): error C2466: 不能分配常量大小为 0 的数组
1>f:\code\c语言入门经典\字符串和文本的应用\joining_strings.c(21): error C2133: “joke”: 未知的大小
1>f:\code\c语言入门经典\字符串和文本的应用\joining_strings.c(23): warning C4034: sizeof 返回 0
1>f:\code\c语言入门经典\字符串和文本的应用\joining_strings.c(31): warning C4034: sizeof 返回 0

2个回答

char joke[length + strnlen_s(preamble, sizeof(preamble)) + 1];
这个写法,在一些编译器上可以,另一些不可以。gcc就可以。
在不允许数组申明中使用变量的编译器,可以用malloc动态分配。

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复东_烨: 用 strlen
接近 2 年之前 回复
qq_36295720
793416 谢谢回答,指针现在还没看到,并且在gcc中出现未定义strnlen_s,gcc不支持这种函数。
接近 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复东_烨: 或者不修改任何代码,找基于gcc的编译器编译
接近 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复东_烨: 定义成指针用malloc/new分配
接近 2 年之前 回复
qq_36295720
793416 那这条语句如何更改?小白看不懂。。。。。
接近 2 年之前 回复

char*a=NULL;//声明一个指向a的char*类型的指针

a=(char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给a

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!