C - 对数组和字符串的混淆

时间:2014-07-23 15:02:01

标签: c arrays string

我对编程很新,我真的对字符串和数组感到困惑。根据我在网上和我的书中所读到的,一个字符串只能包含字符(字母而不是数字),而数组只能包含整数(数字而非字母)。我的这些概念是错误的吗?

6 个答案:

答案 0 :(得分:1)

你的观念是错误的 在c中,没有字符串作为数据类型。 String是一个元素数组,可以表示字符。旧的ascii表只包含256个字符(8位无符号数)。数组中的前0个数字被解释为字符串的结尾。数组中的每个数字表示根据ascii代码页的符号。

char a[10] = {'o', 'n', 'e', '\0'};
char b[10] = {111, 110, 101, 0};

这里a和b相等。你也可以

int x = a[0];

和x将保留'o'字符,即111号。所以

printf("%d", a[0]);

将输出111和

printf("%c", a[0]);

将打印o。因为它是数字,你可以比较字符

if ('o' > 'A')

是事实,因为(int)'o'== 111和(int)'A'== 65.但是8位太少而不能保留许多不同的字符。因此,其他类型可用于保持字符,例如,wchar_t在unicode中很流行。所以,string可以是wchar_t,int或者你喜欢的任何数组。

答案 1 :(得分:1)

尝试这些,应该清除所有当前/未来的疑虑。

阵列:http://en.wikipedia.org/wiki/Array_data_structure

字符串:http://en.wikipedia.org/wiki/String_%28computer_science%29

答案 2 :(得分:0)

数组是一系列值,其中值可以是任何类型。你可以有一个整数数组:

int a[10]; // an array of 10 integers

双精度浮点数的数组:

double b[10]; // an array of 10 doubles

指向整数的指针数组:

int *c[10]; // an array of 10 pointers

包含10个字符的数组:

char d[10]; // an array of 10 characters

等等。类型也可能更复杂 - 你可以有结构数组等。

C没有专门针对字符串的内置类型 - 字符串只是字符数组。按照惯例,为了与大量现有C代码兼容,C中的字符串以空值终止,即它们以值为0的字符'\0'结尾。当人们在C编程的上下文中谈论“C字符串”或“字符串”时,它们意味着以空字符结尾的字符序列。字符串不一定必须创建为数组(如char e[255]) - 它可能使用类似malloc()的函数创建,但由于数组只是一个连续的值列表无论如何都得到相同的结果。

答案 3 :(得分:0)

  • C 字符串中,只能存储为字符数组。没有其他方法可以存储字符串。
  • 数组中,您可以存储任何数据类型,如整数,浮点数,字符或更多。
  • 可以将字符数组视为可以根据您应用操作的字符串。
  • 在字符串中,最后一个字符是'\ 0'(空字符),表示该字符串已结束。
    例如

    int array[10]; //array of 10 ints char string[10]; //string or character array of length 10 float aa[10]; //It can stores 10 float values

答案 4 :(得分:0)

简单:

C stringarray包含chars

当您说“数组不能只包含int时,您并不完全正确。数组只能包含一种数据,而不仅仅是整数;

int a[] =    {1, 2, 3, 4, 5};     // Array of ints
double b[] = {1.1, 2.2, 3.3, 4.4, 5.5}; // Array of doubles
char[] = {'a', 'b', 'c'}; // Array of chars, also called string.

答案 5 :(得分:0)

首先,要意识到术语'字符串'是从术语'字符串字符'演变而来的。 'char of char'的一个很好的定义可能是“在记忆中彼此相邻的一些char值”。

有什么可能的'char值'?考虑以下char arrays的初始化:

char array1[8] = {77, 97, 104, 111, 110, 114, 105, 0};
char array2[8] = {0x4D, 0x61, 0x68, 0x6F, 0x6E, 0x72, 0x69, 0x00};
char array3[8] = {'\x4D', '\x61', '\x68', '\x6F', '\x6E', '\x72', '\x69', '\x00'};
char array4[8] = {'M', 'a', 'h', 'o', 'n', 'r', 'i', '\0'};
char array5[8] = "Mahonri";

以上任何一项都可以归类为“字符串”吗?当然。它们都是'char字符串'以及'char数组'。这些术语是可以互换的。

现在考虑以下事项:

int string1[8] = {77, 97, 104, 111, 110, 114, 105, 0};
int string2[8] = {0x4D, 0x61, 0x68, 0x6F, 0x6E, 0x72, 0x69, 0x00};
int string3[8] = {'\x4D', '\x61', '\x68', '\x6F', '\x6E', '\x72', '\x69', '\x00'};
int string4[8] = {'M', 'a', 'h', 'o', 'n', 'r', 'i', '\0'};
int string5[8] = {L"Mahonri"};

以上是'int'字符串或'int arrays'。对于那些将术语“字符串”与“字符”类型相关联的人来说,这可能难以接受。然而,这是“字符串”和“数组”这两个术语的正确使用。

因此,引用'i> {any type} '的字符串并不合适,因为引用'i> {any type} ”。

所以,关于声明:...A string can only hold char's (letters and not numbers) and arrays can hold only ints ( numbers and not letters).

我倾向于将这句话称为“废话”。


有人说;术语“字符串”一词被称为“字符串字符串”,以及“C字符串”。 “C字符串”的良好定义可能是“在内存中彼此相邻的多个char值,其中字符串中最后一个相关字符的值通常为零”。

'C string'可以被称为'char数组'吗?是。


因此,术语“字符串”本身实际上是模棱两可的。也许使用术语“C字符串”或“字符串字符串”将更加明确。但是,这两个术语都可以称为“char数组”。

问题中表现出的困惑在于寻找“字符串”和“数组”之间的差异,而实际上并没有区别。