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
廣告