数学和数学,代码与代码,但是在现实世界中,我们必须处理单词,句子等。C语言中是否有任何东西可以处理这些类型的事物?答案是肯定的,它们被称为string。
我们可以将字符串视为字符数组,例如“ Sam”是字符串。字符'S''a''m''\ 0'
下标0123
因此,“ Sam”是字符“ S”,“ a”,“ m”和“ \ 0”的数组
查看第3个索引处的字符。它代表空字符。ASCII值的“\ 0”是0和的正常0是48。它表示字符串的终止(结束)。
我们将字符串声明为:
char name [] =“ Sam”;
如您所见,字符串(char name[])的语法还告诉我们它是一个字符数组。
我们总是在“”中放置一个字符串,在“”中放置一个字符。
我们还可以使用字符声明一个字符串变量,如下所示。
char name [] = {'S','a','m','\ 0'};
让我们看两个示例,分别显示不带for循环和带循环的字符串。#include
int main()
{
char str[ ] = "Hello";
printf("%s\n", str);
return 0;
}
请注意,“%s”用于字符串。
在上面的示例中,我们一次打印了整个字符串。现在,我们将看到相同的示例,但使用for循环打印单个字符。#include
int main()
{
char str[ ] = "Hello";
int i;
for( i=0; i<6; i++)
{
printf("%c\n", str[i]);
}
return 0;
}
在第一个示例中,我们打印了字符串,并为此%s与printf函数一起使用。而在第二个示例中,我们每次只打印单个字符,因此我们使用%c了该printf函数。
现在,让我们看一个从用户输入字符串的示例。#include
int main()
{
char name[25];
printf("Enter your name\n");
scanf("%s", name);
printf("Your name is %s\n", name);
return 0;
}
您一定想知道在声明名称数组时将数组大小写为25的原因。这样做是因为我们不知道用户将输入的名称的长度。如果在上面的示例中,我们将数组的大小指定为2,则字符串变量将不会采用输入,因为输入的大小大于数组的大小。因此,为了安全起见,请采用大于假定的输入大小的数组大小。
在使用scanf从用户那里获取字符串时,请勿在字符串名称前使用“&”,因为在“ name [25]”中,“ name”本身就是指向“ name [25]”的指针。
scanf从用户到字符串变量仅需要一个词。它以任何空白结尾。尝试在空格后写点东西,这只会占用第一个单词。
例如,如果在上面的示例中,我们输入Sam Brad作为名称,则输出将仅是Sam,因为scanf仅考虑一个单词并在第一个单词之后终止。
如何获取多行字串#include
int main()
{
char name[25];
printf("Enter your name\n");
gets(name);
printf("Your name is ");
puts(name);
return 0;
}
我们可以使用gets和puts接受输入并给出包含多个单词的字符串的输出,其中gets用于获取用户的字符串输入,而puts用于显示字符串。
考虑以下示例。
如果您收到关于“获取”的任何警告,请忽略它。
要进行打印,您也可以使用printf代替puts。
您也可以使用'scanf(“%[^ \ n] s”,name);' 用于获取多字串。
指针和字符串
字符串也可以使用指针声明。让我们考虑一个例子。#include
int main()
{
char name[ ]= "Sam";
char *p;
p = name; /* for string, only this declaration will store its base address */
while( *p != '\0')
{
printf("%c", *p);
p++;
}
return 0;
}
在上面的示例中,“ p”存储名称[0]的地址,因此“ * p”的值等于名称[0]的值,即“ S”。因此,在while循环中,第一个字符被打印出来,并将p++'p'的值加1,以便现在p + 1指向name [1]。这一直持续到指针到达字符串的末尾,即,在'* p'等于'\ 0'之前。
将字符串传递给函数
这与我们处理其他阵列相同。唯一的区别是这是一个字符数组。而已!
让我们来看一个例子。#include
void display( char ch[])
{
printf("String :");
puts(ch); /* display string */
}
int main()
{
char arr[30];
printf("Enter string\n");
gets(arr); /* input string from user */
display(arr);
return 0;
}
预定义的字符串函数
我们可以执行不同类型的字符串功能,例如连接2个字符串,将一个字符串与另一个字符串进行比较或找到字符串的长度。让我们看一下这些函数的列表。函数用途
len计算字符串的长度
strcat在另一个字符串的末尾附加一个字符串
Strncat在另一个字符串的末尾追加字符串的前n个字符
strcpy将字符串复制到另一个
strncpy将一个字符串的前n个字符复制到另一个
strcmp比较两个字符串
strncmp比较两个字符串的前n个字符
strchr查找字符串中给定字符的首次出现
strrchr查找字符串中给定字符的最后一次出现
strstr查找另一个字符串中给定字符串的首次出现
这些函数在“ string.h”头文件中定义,因此我们需要通过编写以下代码在代码中包含该头文件
#include
我们将看到一些例子strlen,strcpy,strcat和strcmp因为这些是最常用的。
确保检查本章进一步阅读中提到的文章,以查看string.h库中每个可用功能的示例。
strlen(s1)计算字符串s1的长度。
空格也以字符串的长度计算。#include
#include
int main()
{
char name[ ]= "Hello";
int len1, len2;
len1 = strlen(name);
len2 = strlen("Hello World");
printf("length of %s = %d\n", name, len1);
printf("length of %s = %d\n", "Hello World", len2);
return 0;
}
在计算字符串的长度时,strlen不会计数“ \ 0”。
strcpy(s1, s2)将第二个字符串s2复制到第一个字符串s1。#include
#include
int main()
{
char s2[ ]= "Hello";
char s1[10];
strcpy(s1, s2);
printf("Source string = %s\n", s2);
printf("Target string = %s\n", s1);
return 0;
}
strcat(s1, s2)将第二个字符串s2连接(连接)到第一个字符串s1。#include
#include
int main()
{
char s2[ ]= "World";
char s1[20]= "Hello";
strcat(s1, s2);
printf("Source string = %s\n", s2);
printf("Target string = %s\n", s1);
return 0;
}
请注意,在上面的示例中,我们将数组大小指定为“ s1”,因为我们要向其中添加另一个字符串的字符。给定的数组大小应大于或等于串联后的字符串数组的大小。
strcmp(s1, s2)比较两个字符串,找出它们是否相同。它逐字符比较两个字符串,直到不匹配为止。如果两个字符串相同,则返回0。如果不是,则返回第一个非匹配字符对的ASCII值之间的差#include
#include
int main()
{
char s1[ ]= "Hello";
char s2[ ]= "World";
int i, j;
i = strcmp(s1, "Hello");
j = strcmp(s1, s2);
printf("%d \n %d\n", i, j);
return 0;
}
二维字符数组
与整数和其他数据类型的2 D数组相同,我们也有2 D字符数组。
例如,我们可以写char names[4][10] = {
"Andrew",
"Kary",
"Brown",
"Lawren"
};