字符数组

1. 字符数组的定义和初始化

1.1 定义字符数组

字符数组可以用来存储多个字符,它的定义方式类似于其他类型的数组:

1
char array_name[size];

其中 size 是数组的大小,表示最多可以存储 size 个字符。

1.2 初始化字符数组

字符数组可以在定义时进行初始化:

1
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

也可以使用字符串字面量来初始化字符数组:

1
char greeting[] = "Hello";

在这种情况下,编译器会自动计算数组的大小,并在最后添加一个空字符’\0‘ 来表示字符串的结束。

2.字符数组的输入与输出

1
2
char s[20];
scanf("%s",s);

该操作会以空格为结束输入。

scanf 遇到空格、制表符(\T)或换行符(\n)时会停止。

例如

输入hello world

s字符数组中只存了hello

即为了安全地读取包含空格的字符串,可以使用 fgets

前提调用string库函数。

1
2
char s[20];
fgets(s,20,stdin);

但是在使用 fgets 函数读取字符串时,通常需要注意处理换行符。换行符是输入的一部分,会被 fgets 存储在缓冲区中,这可能会对字符串处理产生影响。下面详细解释为什么需要处理换行符以及如何处理换行符。

2.1为什么需要处理换行符

  1. 字符串处理的需求:在许多情况下,我们希望输入的字符串不包含换行符。例如,用户输入的名字、密码等信息通常不应包含换行符。
  2. 一致性:许多字符串操作函数如 strlenstrcmpstrcat 等,都假设字符串不包含不必要的换行符。保留换行符可能会导致这些操作产生意外结果。
  3. 输出美观:直接输出包含换行符的字符串可能会导致输出格式混乱。

fgets 函数读取输入行时,包括换行符(如果缓冲区足够大),并将其作为字符串的一部分存储在缓冲区中,最后添加一个空字符 \0 来终止字符串。例如,如果用户输入了 “Hello, World!” 并按下回车键,fgets 将读取并存储 “Hello, World!\n”。

2.2如何处理换行符

方法一:手动移除换行符

可以在读取字符串后手动检查并移除换行符。这是最常见的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <string.h>

int main() {
char buffer[100];

printf("Enter a string: ");
if (fgets(buffer, sizeof(buffer), stdin) != NULL) {
// 查找字符串长度
size_t len = strlen(buffer);
// 如果最后一个字符是换行符,则将其替换为字符串终止符
if (len > 0 && buffer[len - 1] == '\n') {
buffer[len - 1] = '\0';
}
printf("You entered: %s\n", buffer);
} else {
printf("Error reading input.\n");
}

return 0;
}

在这段代码中,读取输入后,通过 strlen 函数获取字符串长度,然后检查最后一个字符是否是换行符。如果是,将其替换为字符串终止符 \0

输出用printf就行了。

3.字符数组函数

C 标准库提供了一些常用的字符串处理函数,定义在 <string.h> 头文件中。

3.1 strlen函数

计算字符串的长度,不包括结尾的空字符 \0

1
2
3
#include <string.h>
char s[20];
int len = strlen(s);

3.2 strcat函数

将源字符串连接到目标字符串的末尾。目标字符串必须足够大以容纳连接后的字符串和终止字符 \0

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <string.h>
int main() {
char dest[50] = "Hello,";
char src[] = "World!";
strcat(dest, src);
printf("%s\n", dest);
return 0;
}

运行结果

Hello,World!

3.3 strcmp函数

比较两个字符串。如果相等返回 0,第一个字符串大于第二个返回正值,小于返回负值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <string.h>

int main() {
char str1[] = "Hello";
char str2[] = "World";
int result = strcmp(str1, str2);
if (result == 0) {
printf("Strings are equal.\n");
} else if (result < 0) {
printf("str1 is less than str2.\n");
} else {
printf("str1 is greater than str2.\n");
}
return 0;
}

3.4转换字母大小写函数

在 C 语言中,可以使用以下函数来转换字母的大小写:

1. toupper

功能

将小写字母转换为大写字母。

原型

1
int toupper(int c);

示例

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <ctype.h>

int main() {
char ch = 'a';
char upper = toupper(ch);
printf("%c converted to uppercase is %c\n", ch, upper);
return 0;
}

2. tolower

功能

将大写字母转换为小写字母。

原型

1
int tolower(int c);

示例

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <ctype.h>

int main() {
char ch = 'A';
char lower = tolower(ch);
printf("%c converted to lowercase is %c\n", ch, lower);
return 0;
}

注意事项

  • 这两个函数的参数和返回值都是整型,因为它们可以处理所有可能的字符值,而不仅仅是字母。
  • 如果参数不是字母,则这两个函数返回原始字符值,不进行任何转换。
  • 这些函数在 <ctype.h> 头文件中声明。

总结

使用 touppertolower 函数可以方便地转换字母的大小写,这在许多情况下都非常有用,比如标准化输入或输出,进行字符串比较等。在处理字符时,要确保使用这些函数来确保处理的一致性和正确性。

注:不推荐使用strupr和strlwr,strlwrstrupr 函数是某些编译器提供的非标准函数,它们分别用于将字符串转换为全小写和全大写。尽管它们在某些编译器上可用,但并不是所有的标准 C 库都提供这些函数。在一些编译器和环境中,使用这些函数可能会导致不可移植性问题,因为它们不是标准 C 函数,可能会因编译器和平台的不同而表现不同。

另一方面,touppertolower 函数是标准 C 函数,它们提供了一种可移植且广泛支持的方法来转换单个字符的大小写。因此,在编写可移植的 C 代码时,通常推荐使用 touppertolower 函数来处理字符的大小写转换。

虽然 strlwrstrupr 函数在某些情况下可能很方便,但它们不属于 C 标准库的一部分,这意味着它们的行为可能会因编译器或平台的不同而有所不同。因此,在编写可移植的 C 代码时,最好避免使用这些非标准函数。

3.自定义转换大小写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<stdio.h>
char CASE(char c)
{
if(c>='A'&& c<='Z')
{
return c+('a'-'A');
}
else if(c>='a'&& c<='z')
{
return c -('a' - 'A');
}
else
return c;
}
int main()
{
/**********begin*********/
char input;
scanf("%c",&input);
char output = CASE(input);
printf("%c\n",output);
return 0;
/*********end*********/
}

测试输入:A

预期输出:a

测试输入:b

预期输出:B