C字符串类型定义

时间:2014-12-18 16:26:19

标签: c

我只是想写一个类似字符串的字符,你可以写:

string s;

我想这样做:

#define string char *

然后例如在main函数中我只需要编写string s;,如果我输入不同的变量名,那么它就不起作用了。

如何改进定义,或者我如何使用" typedef"对于这份工作,如果做到这一点并不是一个坏习惯。或者是否有更好的方法来制作变量类型的字符串?
我在搜索,但我想我找不到答案。

3 个答案:

答案 0 :(得分:7)

不能在C中创建string类型的变量,因为" string"不是一种类型。

A" string"根据定义,"由第一个空字符"终止并包括第一个空字符的连续字符序列。它不是数据类型,而是数据格式。

char的数组可能包含字符串。 char*可能指向字符串。他们都不是 一个字符串。

如果您愿意,可以定义

typedef char *string; /* not recommended */

但这有误导性,因为我提到的char*类型的变量不是字符串。

最佳做法是直接使用char*。这清楚表明你的变量是一个指针。它也与标准库的定义方式一致;例如,strlen函数声明为:

size_t strlen(const char *s);

这也与最有经验的C程序员编写处理字符串的代码的方式一致。

由于C处理数组的方式(或多或少作为二等公民),数组(包括包含字符串的数组)通常通过指向其元素的指针进行操作。我们可以使用指针算法遍历数组。假装指针数组,或 是一个字符串,这很诱人,似乎可以使代码更容易理解,但从长远来看它只会导致混乱。

这样的宏观方法
#define string char*

甚至比typedef更糟糕。宏被扩展为令牌序列;处理器不知道C声明的语法。所以鉴于上面的定义,这个:

string x, y;

扩展为

char* x, y;

x定义为char*,将y定义为char。如果您需要某个类型的名称,typedef几乎总是优于#define

答案 1 :(得分:3)

您必须了解Preprocessor是什么。至于你的问题,正确的解决方案是

typedef char *string;

如果你想使用预处理器,请删除半冒号和s这样的

#define string char *

在第二种情况下,预处理器会将string的每次出现替换为char *,因此如果您声明

string x, y;

它将扩展为

char *x, y;

其中x如果指向chary的指针只是char,则这是误导性的,应该避免使用。

还有一件事,当在C中工作时,隐藏一些变量是指针的事实绝不是一个好主意,所以像

这样的事情
typedef SomeType *SomeTypeName;

其中SomeType可以是任何类型,通常是一个坏主意,你可以做一些我已经看到的澄清这一点的东西,你可以将P附加到SomeType,像这样

typedef SomeType *SomeTypeP;

但我个人更喜欢*typedef s

中的任何一个

答案 2 :(得分:-1)

别。 string是一个C ++关键字。如果涉及到C ++,它不仅会引起问题,更重要的是,它会引起混淆并隐藏你正在处理指针的事实。

更新:伙计们,这不是关键字。但是,如果您在代码中添加了using namespace std;,那么string就是标准库中的C ++类。

我想说的是,为char *创建别名并不常见,而且可能会让其他人看到您的代码时感到困惑。