C字符串中无效的初始化项



我正在测试C中的大写到小写转换器(我是相对较新的),并且我在主文件中遇到了一些问题(我在下面附上了)。我可以添加upperlower.c代码,但我不认为这与我的问题有关。我得到了一些无效的初始化错误,我认为这是可行的。我已经附上了错误信息的图像。您还可以在代码中看到,我已经注释掉了一些策略方法,因为它们会导致一些运行时分割错误。有人知道发生了什么吗?错误消息

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "upperlower.h"
#define SAMPLESTRING "AbCdEfGhIjKlMnOpQrStUvWxYz"
int main()
{
    char* lower[] = SAMPLESTRING;
    char* upper[] = SAMPLESTRING;
    // strcpy(*lower, SAMPLESTRING);
    // strcpy(*upper, SAMPLESTRING);
    ToLower(lower, lower);
    ToUpper(upper, upper);
    printf("Lower: %snUpper: %sn", lower, upper);
}

输入char * lower[N];,您要求编译器在字符数组上创建一个指针。

但是你只想要一个字符数组:

char lower[] = SAMPLESTRING;
char upper[] = SAMPLESTRING;

选自C标准(6.7.9 Initialization)

14 字符类型的数组可以由字符初始化字符串文字或UTF−8字符串字面值,可选包含在括号. 字符串字面值的连续字节(包括如果有空间或数组为,则终止null字符初始化数组的元素

也就是说,你可以声明一个字符数组并用字符串字面值初始化它,比如

char lower[] = SAMPLESTRING;

但是你声明了一个类型为char *的指针数组而不是字符数组。在这种情况下,您需要将初始化式用大括号括起来,如

char* lower[] = { SAMPLESTRING };

在上面的行中,声明了一个数组,其中一个元素的指针类型为char *,指向字符串字面值SAMPLESTRING的第一个字符。然而,使用指针(数组的单个元素),您可能不会更改字符串字面值。任何更改字符串字面值的尝试都会导致未定义的行为。

考虑printf的调用

printf("Lower: %snUpper: %sn", lower, upper);

在那里使用了格式字符串"%s",似乎你要处理字符数组。否则你必须写

printf("Lower: %snUpper: %sn", lower[0], upper[0]);

所以你需要写

char lower[] = SAMPLESTRING;
char upper[] = SAMPLESTRING;

char lower[] = { SAMPLESTRING };
char upper[] = { SAMPLESTRING };

不是

char* lower[] = SAMPLESTRING;
char* upper[] = SAMPLESTRING;

在这种情况下,strcpy的调用看起来像

strcpy( lower, SAMPLESTRING);
strcpy( upper, SAMPLESTRING);

,虽然数组已经包含了这个字符串字面值,因为它们的初始化。

您可能会感到困惑的部分是使用全局常量作为字符数组的值。

使用全局常量设置值等同于使用局部变量、字符串或字符数组设置值。

这些方法中的任何一个都应该是足够的:

char array[] = globalvariable;
char array[] = localvariable;
char array[] = "this is a string";
char array[] = {'t','h','i','s',' ','i','s',' ','a',' ','s','t','r','i','n','g'}

如果你打算使用指针,那么用于指向数组的数组变量不必是数组,只需是指针即可。

使用您的代码,这将像这样执行:
char * lower;
char * upper;

最新更新