我正在测试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;