C语言字符串



C语言字符串

C语言中的字符串是由字符型数据组成的一维数组,数组的最后一个字符是“空字符”,用'\0'表示。因此,C语言中的字符串可以定义为以空字符结尾的字符型值序列。

在C语言中创建字符串

让我们创建一个字符串“Hello”。它包含五个字符型值。在C语言中,字符型的字面量表示使用单引号——例如'H'。这五个字母用单引号括起来,后面跟着一个用'\0'表示的空字符,并赋值给一个字符型数组。数组的大小是五个字符加一个空字符——六个。

示例

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

不指定大小初始化字符串

C语言允许您在不声明大小的情况下初始化数组,在这种情况下,编译器会自动确定数组的大小。

示例

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

在内存中创建的数组可以示意性地显示如下:

String Representation

如果字符串没有以"\0"结尾,则会导致不可预测的行为。

注意:字符串的长度不包括空字符。strlen()库函数返回此字符串的长度为5。

遍历字符串

您可以使用for循环或任何其他循环语句遍历字符串(字符数组)以访问和操作字符串的每个字符。

示例

在下面的示例中,我们正在打印字符串的字符。

#include <stdio.h>
#include <string.h>

int main (){

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

   for (int i = 0; i < 5; i++) {
      printf("%c", greeting[i]);
   }

   return 0;
}

输出

它将产生以下输出:

Hello

打印字符串(使用%s格式说明符)

C语言提供了一个格式说明符“%s”,当您使用printf()fprintf()函数时,它用于打印字符串。

示例

“%s”说明符告诉函数迭代数组,直到遇到空终止符(\0)并打印每个字符。这有效地打印了字符数组表示的整个字符串,而无需使用循环。

#include <stdio.h>

int main (){

   char greeting[] = {'H', 'e', 'l', 'l', 'o', '\0'};
   printf("Greeting message: %s\n", greeting );

   return 0;
}

输出

它将产生以下输出:

Greeting message: Hello

您可以声明一个超大的数组并赋值较少的字符,C编译器对此没有问题。但是,如果大小小于初始化中的字符数,则输出中可能会出现垃圾值。

char greeting[3] = {'H', 'e', 'l', 'l', 'o', '\0'};
printf("%s", greeting);

使用双引号构造字符串

与其构造单个字符值用单引号括起来的char数组,并使用“\0”作为最后一个元素,C语言允许您通过将字符用双引号括起来来构造字符串。这种初始化字符串的方法更方便,因为编译器会自动添加“\0”作为最后一个字符。

示例

#include <stdio.h>

int main() {
  // Creating string
  char greeting[] = "Hello World";

  // Printing string
  printf("%s\n", greeting);

  return 0;
}

输出

它将产生以下输出:

Hello World

使用scanf()输入字符串

声明以空字符结尾的字符串,如果您想要求用户输入字符串,则会造成困难。您可以借助for循环,一次接受一个字符并将其存储在数组的每个下标中:

语法

for(i = 0; i < 6; i++){
   scanf("%c", &greeting[i]);
}
greeting[i] = '\0';

示例

在下面的示例中,您可以使用scanf()函数输入字符串,在输入特定字符(下面的示例中为5个)后,我们分配空值('\0')以终止字符串。

printf("Starting typing... ");

for (i = 0; i < 5; i++) {
  scanf("%c", &greeting[i]);
}

// Assign NULL manually
greeting[i] = '\0';

// Printing the string
printf("Value of greeting: %s\n", greeting);

输出

运行代码并检查其输出:

Starting typing... Hello
Value of greeting: Hello

示例

不可能输入"\0"(空字符串),因为它是非打印字符。为了克服这个问题,在scanf()语句中使用了"%s"格式说明符:

#include <stdio.h>
#include <string.h>

int main (){

   char greeting[10];

   printf("Enter a string:\n");
   scanf("%s", greeting);

   printf("You entered: \n");
   printf("%s", greeting);

   return 0;
}

输出

运行代码并检查其输出:

Enter a string:
Hello
You entered:
Hello

注意:如果数组的大小小于输入字符串的长度,则可能会导致垃圾数据、数据损坏等情况。

包含空格的字符串输入

scanf("%s")读取字符,直到遇到空格(空格、制表符、换行符等)或EOF。因此,如果您尝试输入包含多个单词(用空格分隔)的字符串,则C程序会将第一个空格之前的字符作为字符串的输入。

示例

看看下面的例子:

#include <stdio.h>
#include <string.h>

int main (){

   char greeting[20];

   printf("Enter a string:\n");
   scanf("%s", greeting);

   printf("You entered: \n");
   printf("%s", greeting);

   return 0;
}

输出

运行代码并检查其输出:

Enter a string:
Hello World!

You entered:
Hello

使用gets()和fgets()函数输入字符串

要接受包含空格的字符串输入,我们应该使用gets()函数。它被称为非格式化控制台输入函数,在"stdio.h"头文件中定义。

示例:使用gets()函数输入字符串

看看下面的例子:

#include <stdio.h>
#include <string.h>

int main(){

   char name[20];

   printf("Enter a name:\n");
   gets(name);

   printf("You entered: \n");
   printf("%s", name);

   return 0;
}

输出

运行代码并检查其输出:

Enter a name:
Sachin Tendulkar

You entered: 
Sachin Tendulkar

在较新的C版本中,gets()已被弃用。它是一个潜在的危险函数,因为它不执行边界检查,可能会导致缓冲区溢出。

建议改用fgets()函数。

fgets(char arr[], size, stream);

fgets()函数可用于从任何输入流(例如stdin(键盘)或FILE(文件流))接受输入。

示例:使用fgets()函数输入字符串

下面的程序使用fgets()并从用户处接受多词输入。

#include <stdio.h>
#include <string.h>

int main(){

   char name[20];

   printf("Enter a name:\n");
   fgets(name, sizeof(name), stdin);

   printf("You entered: \n");
   printf("%s", name);

   return 0;
}

输出

运行代码并检查其输出:

Enter a name:
Virat Kohli

You entered: 
Virat Kohli

示例:使用scanf("%[^\n]s")输入字符串

您也可以使用scanf("%[^\n]s")作为替代方案。它读取字符,直到遇到换行符("\n")。

#include <stdio.h>
#include <string.h>

int main (){

   char name[20];

   printf("Enter a name: \n");
   scanf("%[^\n]s", name);

   printf("You entered \n");
   printf("%s", name);

   return 0;
}

输出

运行代码并检查其输出:

Enter a name: 
Zaheer Khan

You entered 
Zaheer Khan

使用puts()和fputs()函数打印字符串

我们一直在使用带有%s说明符的printf()函数来打印字符串。我们也可以使用puts()函数(在C11和C17版本中已弃用)或fputs()函数作为替代方案。

示例

看看下面的例子:

#include <stdio.h>
#include <string.h>

int main (){

   char name[20] = "Rakesh Sharma";

   printf("With puts(): \n");
   puts(name);

   printf("With fputs(): \n");
   fputs(name, stdout);

   return 0;
}

输出

运行代码并检查其输出:

With puts(): 
Harbhajan Singh

With fputs(): 
Harbhajan Singh
广告
© . All rights reserved.