以下是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef int index_key;
typedef char text_t;
text_t *create_text()
{
//text_t text[SIZ];
text_t *c;
text_t text[]="fl";
c= text;
return c;
}
int main()
{
text_t * create();
return 0;
}
我收到错误 - 在']'标记之前的预期表达式。为什么会出现这个错误?不是text []全球声明,我可以在任何地方访问它吗?这个程序有什么问题,我应该如何纠正它。
答案 0 :(得分:1)
您不能拥有像
这样的数组定义text_t text[];
指定大小
#define SIZ 256 //arbitary value
text_t text[SIZ];
或使用初始化程序。
text_t text[] = {`A`, `B`, `C`};
修改强>
根据最新添加的内容,请注意"sldk"
(正如您已经使用过)和{'s', 'd', 'l', 'k'}
(因为我建议)不一样。前者是字符串文字,而后者是char
s的 initalizer list 。您可以在案例中使用第二个,而不是第一个。
编辑2
那就是说,你的create_text()
功能是错误的。实际上,您将返回本地变量text
的地址。不正确。将调用UB。
答案 1 :(得分:1)
我看到以下问题:
text_t text[];
是声明,而不是定义。您必须添加定义text
的行,例如:
text_t text[100];
该行
text[]="sldk";
两个帐户错误。
您无法使用=
运算符分配给数组。
您无法使用text[]
来访问该阵列。
这是您程序的固定版本。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int index_key;
typedef char text_t;
// This is a forward declaration of the array.
text_t text[];
text_t *create()
{
text_t *c;
// One way to get some string into a char array.
strcpy(text,"sldk");
c = text;
return c;
}
// This is the definition of the array.
text_t text[100];
int main()
{
text_t * create();
return 0;
}
<强>更新强>
关于您更新的create_text
功能...
它应该可以工作,因为字符串文字存储在程序的只读存储器中。一旦您尝试更改其中的任何内容,它将导致问题。使用更安全的方法会更好,例如:
text_t *create_text()
{
text_t *c = malloc(20);
strcpy(c, "fl");
return c;
}
答案 2 :(得分:0)
与C ++,Java或C#不同,C语言没有内置的字符串数据类型。 字符串表示为C中的字符数组。因此,C中的任何数组都应该有一些大小。
int numbers[10];
char string[50];
对这些类型的字符串进行操作的C函数(如strlen
计算字符串的长度需要在数组末尾添加'null' or '\0'
字符。
使用字符串文字初始化字符数组,例如&#34; test&#34;将自动在末尾插入一个空字符。
char str[10] = "test";
characters stored {'t','e','s','t','\0'}
如果用逗号分隔的字符初始化它,则需要明确指定此字符。
char str[10] = {'t','e','s','t', '\0'}; //explicit null character
因此,通常数组大小比要存储的字符串的最大大小多一个。所以看到如下声明是很常见的。
char name[MAXLEN+1];
如果您使用的是C ++,则可以使用名为string
的内置数据类型。
string str;
希望这有帮助