字符串不过是线性序列中字符的集合。 “ C”始终将字符串视为单个数据,即使它包含空格。 使用单引号表示法定义单个字符。 字符串用双引号表示。
‘C’提供了标准库<string.h>,其中包含许多函数,可用于轻松执行复杂的字符串操作。
声明和初始化字符串
字符串是一个简单数组,其中char为数据类型。 “ C”语言不直接支持将字符串作为数据类型。 因此,要在“ C”中显示字符串,您需要使用一个字符数组。
声明字符串变量的一般语法:
char string_variable_name [array_size];
给字符串赋值
char string_name[string_length] = "string";
字符串数组的大小必须在声明字符串变量时确定,因为要靠它计算在字符串变量中存储多少个字符。 字符串声明示例如下:
char first_name[15]; //declaration of a string variable char last_name[15];
上面的示例表示声明了两个数组大小为15的字符串变量。这意味着给定的字符数组最多可以容纳15个字符。在 C 语言中,字符串实际上是使用 null 字符 ‘\0’ 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。
下列程序字符串的赋值方法都是可以的。
char first_name[15] = "ANTHONY"; char first_name[15] = {'A','N','T','H','O','N','Y','\0'}; // NULL character '\0' is required at end in this declaration char string1 [6] = "hello";/* string size = 'h'+'e'+'l'+'l'+'o'+"NULL" = 6 */ char string2 [ ] = "world"; /* string size = 'w'+'o'+'r'+'l'+'d'+"NULL" = 6 */ char string3[6] = {'h', 'e', 'l', 'l', 'o', '\0'} ; /*Declaration as set of characters ,Size 6*/
string3最后一个字符必须是 NULL (’\0’),用单引号引用。
C语言也允许无需定义字符数组的大小而初始化字符串变量。 可以通过以下方式完成:
char first_name[ ] = "NATHAN";
数据输入输出的概念及在 C 语言中的实现
1)所谓输入输出是以计算机为主体而言的。
2) 本章介绍的是向标准输出设备显示器输出数据的语句。
3) 在C语言中,所有的数据输入/输出都是由库函数完成的。 因此都是函数语句。
4) 在使用C语言库函数时,要用预编译命令
#include
将有关“头文件”包括到源文件中。
使用标准输入输出库函数时要用到 “stdio.h”文件,因此源文件开头应有以下预编译命令:
#include< stdio.h >
或
#include ”stdio.h”
stdio 是 standard input &outupt 的意思。
考虑到 printf 和 scanf 函数使用频繁,系统允许在使用这两个函数时可不加
#include< stdio.h >
或
#include ”stdio.h”
字符串输入
在编写要求用户输入的交互式程序(人机对话)时,C提供了scanf(),gets()和fgets(), putchar (), getchar(),函数来查找从用户输入的一行文本。
getchar 函数(键盘输入函数)
getchar 函数的功能是从键盘上输入一个字符。
其一般形式为:
getchar();
通常把输入的字符赋予一个字符变量,构成赋值语句,如:
char c;
c=getchar();
例一:
#include<stdio.h> void main() { char c; printf("input a character\n"); c=getchar(); putchar(c); }
使用 getchar 函数还应注意几个问题:
1) getchar 函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。
2) 使用本函数前必须包含文件“stdio.h”。
3) 在 TC 屏幕下运行含本函数程序时, 将等待用户输入一个字符。显示结果后,再输入字符将会推出运行。
4) 程序最后两行可用下面两行的任意一行代替:
putchar(getchar());
printf(“%c”,getchar());
scanf()
当我们使用 scanf()进行读取时,我们使用“%s”格式,而不使用“&”访问变量地址,因为数组名称充当指针。 例如:
#include <stdio.h> int main() { char name[10]; int age; printf("Enter your first name and age: \n"); scanf("%s %d", name, &age); printf("You entered: %s %d",name,age); }
scanf函数的最大问题在于它从不读取整个字符串。 一旦出现空格,换页,垂直制表符,换行符或回车,它将停止读取过程。 假设我们以“zhihui xinpian”作为输入,则scanf函数将永远不会读取整个字符串,因为两个名称之间会出现空格字符。 scanf函数将仅读取zhihui。
为了读取包含空格的字符串,我们使用gets()函数。
gets函数将忽略空格。 当到达换行符时(按Enter键)它将停止读取。例如:
#include <stdio.h> int main() { char full_name[25]; printf("Enter your full name: "); gets(full_name); printf("My full name is %s ",full_name); return 0; }
结果
Enter your full name: zhihui xinpian My full name is zhihui xinpian
更安全的函数是fgets(), 可以读取特定数量的字符:
#include <stdio.h> int main() { char name[10]; printf("Enter your name plz: "); fgets(name, 10, stdin); printf("My name is %s ",name); return 0; }
fgets()的参数为:
- 字符串名称,
- 要读取的字符数,
- stdin表示从标准输入(这儿是键盘输入)中读取数据
字符串输出 :print/display 字符串
putchar 函数(字符输出函数)
putchar 函数是字符输出函数, 其功能是在显示器上输出单个字符。
其一般形式为:
putchar(字符变量)
例如:
putchar(‘A’); (输出大写字母 A)
putchar(x); (输出字符变量 x 的值)
putchar(‘\101’); (也是输出字符 A)
putchar(‘\n’); (换行)
对控制字符则执行控制功能,不在屏幕上显示。
使用本函数前必须要用文件包含命令:
#include<stdio.h>
或
#include “stdio.h”
例3
#include<stdio.h> main(){ char a='B',b='o',c='k'; putchar(a);putchar(b);putchar(b);putchar(c);putchar('\t'); putchar(a);putchar(b); putchar('\n'); putchar(b);putchar(c); }
标准printf函数用于在输出设备上打印或显示字符串。 使用的格式说明符为%s
fputs() 和 printf() 函数用于字符串输出。
fputs() 函数
fputs()需要字符串的名称,和指向显示文本位置的指针。 我们使用stdout标准输出打印到屏幕上,例如:
#include <stdio.h> int main() { char town[40]; printf("Enter your town: "); gets(town); fputs(town, stdout); return 0; }
puts() 函数
puts函数在输出设备上打印字符串,然后将光标移回第一位置。 可以通过以下方式使用puts函数:
#include <stdio.h> int main() { char name[15]; gets(name); //reads a string puts(name); //displays a string return 0; }
这样的语法非常简单。
操作字符串的函数
C 中有大量操作字符串的函数:
序号 | 函数 & 目的 |
---|---|
1 | strcpy(s1, s2); 复制字符串 s2 到字符串 s1。 |
2 | strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。 |
3 | strlen(s1); 返回字符串 s1 的长度。 |
4 | strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。 |
5 | strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。 |
6 | strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。 |
下面的实例使用了上述的一些函数:
#include <stdio.h> #include <string.h> int main () { //string initialization char string1[15]="Hello"; char string2[15]=" World!"; char string3[15]; int val; //string comparison val= strcmp(string1,string2); if(val==0) { printf("Strings are equal\n"); } else { printf("Strings are not equal\n"); } //string concatenation printf("Concatenated string:%s",strcat(string1,string2)); //string1 contains hello world! //string length printf("\nLength of first string:%d",strlen(string1)); printf("\nLength of second string:%d",strlen(string2)); //string copy printf("\nCopied string is:%s\n",strcpy(string3,string1)); //string1 is copied into string3 return 0; }
一些重要的字符串操作函数:
- strncmp(str1, str2, n) : 如果str1的前n个字符等于str2的前n个字符,则返回0;如果str1 <str2,则返回0;如果str1> str2,则返回0。
- strncpy(str1, str2, n) 此函数用于从另一个字符串复制一个字符串。 将str2的前n个字符复制到str1
- strchr(str1, c): 它返回一个指向str1中首次出现的char c的指针,如果找不到字符,则返回NULL。
- strrchr(str1, c): 它反向搜索str1并返回一个指向str 1中char c位置的指针;如果找不到字符,则返回NULL。
- strstr(str1, str2): 它返回一个指向str1中首次出现的str2的指针,如果未找到str2,则返回NULL。
- strncat(str1, str2, n) 将str2的前n个字符附加(连接)到str1的末尾,并返回指向str1的指针。
- strlwr() :将字符串转换为小写
- strupr() :将字符串转换为大写
- strrev() : 反转字符串
将字符串转换为数字
在C编程中,我们可以将一串数字字符转换为一个数值,以防止运行时错误。 stdio.h库包含以下用于将字符串转换为数字的函数:
- int atoi(str)代表ASCII到整数; 它将str转换为等效的int值。 如果第一个字符不是数字或未遇到任何数字,则返回0。
- double atof(str)表示ASCII到浮点数,它将str转换为等效的double浮点值。 如果第一个字符不是数字或未遇到数字,则返回0.0。
- long int atol(str)代表ASCII到长整数(long int),将str转换为等效的长整数值。 如果第一个字符不是数字或未遇到任何数字,则返回0。
范例:
#include <stdio.h> int main() { char *string_id[10]; int ID; printf("Enter a number: "); gets(string_id); ID = atoi(string_id); printf("you enter %d ",ID); return 0; }
字符串指针声明(例如char * string =“ language”)是一个常量,无法修改
摘要:
- 字符串是存储在字符数组中的字符序列。
- 字符串是用双引号引起来的文本。
- 诸如“ d”的字符不是字符串,并且用单引号引起来。
- “ C”提供了标准的库函数来处理程序中的字符串。 字符串操纵器存储在头文件中。
- 在用于程序之前,必须声明或初始化字符串。
- 有不同的输入和输出字符串函数,每个函数都有其功能。
- 不要忘记包括字符串库以使用其功能
- 我们可以通过atoi(),atof()和atol()将字符串转换为数字,这对于编码和解码过程非常有用。
- 我们可以通过定义一个字符串数组来操纵不同的字符串。
Pingback:字符存储方式及字符变量和整形变量互换 – IC知识库