📅  最后修改于: 2020-10-22 01:43:29             🧑  作者: Mango
可以将字符串定义为以null(‘\ 0’)结尾的一维字符数组。字符数组或字符串用于处理诸如单词或句子之类的文本。数组中的每个字符占用一个字节的内存,最后一个字符必须始终为0。终止字符(‘\ 0’)在字符串很重要,因为这是识别字符串结尾的唯一方法。当我们将字符串定义为char s [10]时,字符s [10]被隐式初始化为内存中的null。
有两种方法可以使用C语言声明字符串。
让我们看一下用C语言通过char数组声明字符串的示例。
char ch[10]={'j', 'a', 'v', 'a', 't', 'p', 'o', 'i', 'n', 't', '\0'};
众所周知,数组索引从0开始,因此将如下图所示。
在声明字符串,大小不是必需的。因此,我们可以编写以下代码,如下所示:
char ch[]={'j', 'a', 'v', 'a', 't', 'p', 'o', 'i', 'n', 't', '\0'};
我们还可以使用C语言中的字符串字面量来定义字符串。例如:
char ch[]="javatpoint";
在这种情况下,编译器将在字符串的末尾附加“ \ 0″。
char数组和字面量之间有两个主要区别。
让我们看一个简单的示例,在该示例中声明并打印一个字符串。 ‘%s’用作c语言字符串的格式说明符。
#include
#include
int main(){
char ch[11]={'j', 'a', 'v', 'a', 't', 'p', 'o', 'i', 'n', 't', '\0'};
char ch2[11]="javatpoint";
printf("Char Array Value is: %s\n", ch);
printf("String Literal Value is: %s\n", ch2);
return 0;
}
输出量
Char Array Value is: javatpoint
String Literal Value is: javatpoint
在任何一种编程语言中,遍历字符串都是最重要的方面之一。我们可能需要处理非常大的文本,这可以通过遍历文本来完成。遍历字符串与遍历整数数组有些不同。我们需要知道数组的长度来遍历一个整数数组,而我们可以用空字符字符串的情况下,以确定最终的字符串,并终止循环。
因此,有两种遍历字符串。
让我们讨论其中的每一个。
让我们看一个计算字符串中元音数量的示例。
#include
void main ()
{
char s[11] = "javatpoint";
int i = 0;
int count = 0;
while(i<11)
{
if(s[i]=='a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'u' || s[i] == 'o')
{
count ++;
}
i++;
}
printf("The number of vowels %d",count);
}
输出量
The number of vowels 4
让我们看看使用空字符计算元音数量的相同示例。
#include
void main ()
{
char s[11] = "javatpoint";
int i = 0;
int count = 0;
while(s[i] != NULL)
{
if(s[i]=='a' || s[i] == 'e' || s[i] == 'i' || s[i] == 'u' || s[i] == 'o')
{
count ++;
}
i++;
}
printf("The number of vowels %d",count);
}
输出量
The number of vowels 4
到目前为止,我们已经使用scanf接受来自用户的输入。但是,也可以在字符串的情况下使用它,但要使用不同的方案。考虑下面的代码,该代码在遇到空格时存储字符串。
#include
void main ()
{
char s[20];
printf("Enter the string?");
scanf("%s",s);
printf("You entered %s",s);
}
输出量
Enter the string?javatpoint is the best
You entered javatpoint
从输出中可以明显看出,以上代码不适用于以空格分隔的字符串。为了使此代码适用于以空格分隔的字符串,这是scanf函数所需的次要更改,即,代替编写scanf(“%s”,s),我们必须编写:scanf(“%[^ \ n] s” ,s)指示编译器在遇到新行(\ n)时存储字符串s。让我们考虑以下示例,以存储用空格分隔的字符串。
#include
void main ()
{
char s[20];
printf("Enter the string?");
scanf("%[^\n]s",s);
printf("You entered %s",s);
}
输出量
Enter the string?javatpoint is the best
You entered javatpoint is the best
在这里我们还必须注意,我们不需要在scanf中使用(&)运算符的地址来存储字符串,因为字符串s是一个字符数组和该数组的名称,即s表示字符串的基地址(字符数组),因此我们无需将其与&一起使用。
但是,在使用scanf输入字符串时,必须注意以下几点。
到目前为止,我们已经将指针与数组,函数和原始数据类型一起使用。但是,可以使用指针指向字符串。使用指针指向字符串有很多优点。让我们考虑以下示例,通过指针访问字符串。
#include
void main ()
{
char s[11] = "javatpoint";
char *p = s; // pointer p is pointing to string s.
printf("%s",p); // the string javatpoint is printed if we print p.
}
输出量
javatpoint
我们知道字符串是一个字符数组,指针的使用方式可以与数组相同。在上面的示例中,p被声明为指向字符s的指针。 P的影响与s相似,因为s是字符串的基地址,在内部被视为指针。但是,我们不能更改s的内容或将s的内容直接复制到另一个字符串。为此,我们需要使用指针来存储字符串。在下面的示例中,我们展示了使用指针将字符串的内容复制到另一个字符串。
#include
void main ()
{
char *p = "hello javatpoint";
printf("String p: %s\n",p);
char *q;
printf("copying the content of p into q...\n");
q = p;
printf("String q: %s\n",q);
}
输出量
String p: hello javatpoint
copying the content of p into q...
String q: hello javatpoint
一旦定义了字符串,就不能将其重新分配给另一组字符。但是,使用指针,我们可以将字符集分配给字符串。考虑以下示例。
#include
void main ()
{
char *p = "hello javatpoint";
printf("Before assigning: %s\n",p);
p = "hello";
printf("After assigning: %s\n",p);
}
输出量
Before assigning: hello javatpoint
After assigning: hello