プログラミングC: 投稿 10 – C言語で文字列

AT ALL 入力Cで行われた 我々は宣言する方法に慣れてきました, Cのエントリと文字列単に. この記事では、例の詳細をお話します, 宿題チェーン .

1. 概要

文字列は配列として扱われます 1 文字としてchar型の要素の寸法, 数字やなどの特殊文字 +, -, *, /, $, #,...
慣例により, シーケンスは、ヌル文字で終了します (「 0」 : 登録turong).
例: 次のように格納されている文字列「Infoworldの」:

文字列を格納する方法

文字列を格納する方法

2. いくつかの宣言, 初期化文字列

我々は、次の例を考えて:

// e.g about string - code by nguyenvanquan7826
#include <stdio.h>

int main() 
{
    // khai bao chuoi co toi da 50 ky tu
    char name[50]; 
    printf("Hi, What is your name? \nMy name is: ");
    gets(name);
    printf("Hi %s, welcome to C language\n", name);

    // khoi tao chuoi ngay khi khai bao
    char myLove[] = "Nguyen Thi Lap Lanh";
    puts(myLove);

    return 0;
}

結果:

こんにちは, お名前は何ですか?
私の名前は: グエン·ヴァン·泉
こんにちはグエン・ヴァン・クアン, C言語へようこそ
グエン・ティ輝き

上のプログラムで, 私は、関数を使用しています プット 文字列をプリントアウトするMylove, これはまた、出力文字列に関数であります.

上記のように我々が見ることができる宣言鎖又は中鎖文字列に値を割り当て、インポート宣言ちょうどいいです. しかし、我々は次のように値を割り当て、その後宣言することはできません:

char name[50];
name = "Nguyen Van Quan"; // error

宣言したい場合は、値を代入, 私たちは、文字列のコピー機能を使用する必要があります。 strcpyの 図書館で string.hの 次のように値を保存します:

// e.g about string - code by nguyenvanquan7826
#include <stdio.h>
#include <string.h>

int main() 
{
    char name[50];
    strcpy(name, "Nguyen Van Quan");
    puts(name);

    return 0;
}

3. Cの文字列のいくつかの例

3.1 例 1: 文字列内の単語の数をカウント

文字列を入力し、文字列内の単語の数をカウントしてください. VDチェーン “グエン·ヴァン·泉” 持っている 3 から.

これを行うには, 我々は、連続して文字のそれぞれを参照し、スペースで単語を発散します. そこでこの記事では、文字列にスペースの数をカウントするために提供されます. 文字列の場合 1 単語、スペースなし, ストリング 2 そこから 1 間のスペース 2 そこから. Nは一般には、N-1スペースが存在することになるからです.

次の問題は、スペースをカウントする方法であります? シンプル, これは、最初のオープン文字列として知られている文字の配列であります, 私たちは、文字が文字の連鎖を調べるに向ける閲覧することができますスペースです. しかし、文字列内のすべての文字をブラウズしたいです (文字配列) 彼らは、文字列の文字数を知っている必要があります (配列の要素数).

幸いなことに、図書館で string.hの 我々は、機能として、文字列の長さを取得する機能を持っています strlen関数. (STR – 文字列, のみ – 長さ).

// e.g about string - code by nguyenvanquan7826
#include <stdio.h>
#include <string.h> // for strlen function

int main() 
{
    char s[50];
    printf("Enter a string: ");
    gets(s);

    int i, count = 0; // count - bien dem so luong dau cach
    for (i = 0; i < strlen(s); i++ )
    {
        if(s[i] == ' ') 
        {
            count++;
        }
    }

    printf("Number word in string is: %d\n", count + 1 );

    return 0;
}

かなり簡単なコード, あなたが読んで, NHEを理解し、テストします.

しかし、我々はノート上のコードを持っています:

  • 文字を表現するために、我々は、アポストロフィペアを置きます, その後、我々は引用符で文字列を入れて. 上記スペースは、単一引用符で囲まなければならないと私たちは比較することができます 2 このような比較を持つ文字 2 数, やはり 2 チェーンはそう比較することはできません, あなたはについての詳細を読むことができます 文字列を比較します.
  • 文字列は文字の配列であるため、, 配列アクセスをsとして、私たちはその後、文字列s中のi番目の文字を利用したいはずです[で].
  • この例では、ときにのみ、より大きな鎖長を適用します 0 そして上部の余分な白い看板, 終了または単語の間.
  • 上記のように、ループ, 我々は条件を持っています i < strlen(s), しかし、文字列sの文字数をカウントするために、再びstrlenをループの性質. だから我々は、各反復で条件に直接書き込む場合, プログラムは、sの文字の数をカウントするために、コマンドループSTRLENを実行する必要があります. これは冗長であり、長いプログラムの実行を行います. だから我々は入れます 1 次のように変数は、文字列の長さは出ています:
int len = strlen(s);
for (i = 0; i < len; i++ )
{
    if(s[i] == ' ') 
    {
        count++;
    }
}

3.2 例 2: 標準化されたシーケンス

文字列を入力して、上部にあるすべての余分なスペースを削除してください, 最後の場合は、単語間.

この問題は、ソフトウェアの問題のために重要です, 保存された後にするとき, 入力データは、標準化することが注目されます, 何の黒字または赤字はプロセスでエラーが発生することはありませんし、追求します.

  • 文字列sの最初の文字がs、その後、スペースです[0] スペース, 我々は行ったようにそれを削除します.
  • 単語間の文字冗長すなわちsの場合[で] そして、s[のi 1] スペースに沿って. 我々は削除しました 1 で 2 okです, 単語が区切られますので、 1 スペースが保持している必要があります 1 スペース.
  • 最後列の文字がスペースで、我々は最後の文字がヌル文字で割り当てることによって、それを削除します '\0' 終了した. 最後の文字が配列nの要素であることを忘れないでください a[n-1], その文字列の文字があります s[ strlen(s) - 1 ].

次の問題は、削除する方法です 1 文字列内の文字? 私たちは、文字列のコピー機能を使用する上であなたは例を見て, および削除します 1 または文字列の文字数、私たちは、この機能を使用しますが、コピーのアドレスに使用されます.

文字列s内のjの文字に私から文字を削除するには, 我々は、コマンド strcpy(&s[i], &s[j+1]);. 本質は、我々はのアドレスをコピーしていることです s[j+1] のアドレス s[i].

// e.g about string - code by nguyenvanquan7826
#include <stdio.h>
#include <string.h>

int main() 
{
    char s[50];
    printf("Enter a string: ");
    gets(s);

    // delete all space at start of string
    while( s[0] == ' ' ) strcpy(&s[0], &s[1]);

    // delete all space at end of string
    while( s[ strlen(s)-1 ] == ' ') s[ strlen(s)-1 ] = '\0';

    // delete all space between two word 

    int i;
    for(i = 0; i < strlen(s); i++)
    {
        if( s[i] == ' ' && s[i+1] == ' ')
        {
            strcpy(&s[i], &s[i+1]);
            i--; // why???
        }
    }

    printf("s=%s.\n", s);

    return 0;
}

OK. あなたはNHEを実行します. 先頭に文字列余分の​​スペースを入力し忘れないでください, 最後の, チェックする間.

演習は、あなたのためのより多くがそうであるように、小さな問題は、コードの行を見ることです i--; // why??? そして、なぜこの行を考えます? 私は減少しなければならないのはなぜ 1?

4. 文字列と文字に関するいくつかの関数

テスト機能シンボル. (ライブラリ内のこれらの機能 のctype.h) 異なる値に対するtrueの場合、機能 0. falseの場合、関数値によって 0.

  • int型はisalpha(int型のC) : チェックアルファベットの文字はありません.
  • int型のisdigit(int型のC) : チェック桁の文字ではない.
  • int型のislowerは(int型のC): 小文字をチェックしていない.
  • INT isupper(int型のC): 大文字をチェックしていない.
  • INT iSPACE(int型のC): チェックキャラクタは空です (\N, スペース, \トン).

文字列処理関数. (この関数は、ライブラリ内に位置しています string.hの)

  • int型のstrlen(CHAR * S) 文字列sの長さを返す;
  • チャー* strupr(CHAR * S) 大文字の文字列sへの小文字の変更.
  • チャー* strlwr(CHAR * S) 小文字に大文字に変更.
  • チャー* STRCAT(CHAR * S1, CHAR * S2) 文字列への接続文字列S1 S2;
  • int型にstrcmp(CHAR * S1, CHAR * S2) 負の値であれば文字列s1と小さい文字列s2. と正の価格難民のためのより大きな文字列文字列S1 S2場合. の値を返します 0 もし文字列s2を持つ文字列s1.
  • INT関数strcmpi (CHAR * S1, CHAR * S2) 比較する 2 文字列が、大文字と小文字を区別しません.
  • char *文字のstrcpy(CHAR * S1, CHAR * S2) 文字列にコピー文字列S1 S2.
  • チャー*のstrncpy(CHAR * S1, CHAR * S2, int型のn) 文字列s1にs2の文字列の最初のn文字をコピーします
  • チャー* strnset(CHAR * S ,int型のC, int型のn) n回は、文字列s内の文字cをコピーする.
  • チャー* STRSTR(CHAR * S1, CHAR * S2) 文字列s1で文字列s2の発生を探す. あなたは文字列s1の関数列のアドレスを見つけた場合. NULLとは対照的に.
  • チャー* strrevは(CHAR * S) 文字列を逆に対処するために、逆s.Neu成功した文字列関数を使用して、.

エクササイズ

  1. 指定された文字列名とは別のプログラムを書きます. VDは、輝くグエンティの名前=>分離亜麻
  2. 自分の名前の文字列を標準化し、プログラムを書きます. 最高経営責任者(CEO:ha noi => Ha Noi.
  3. ファンクションスイッチを書きます 1 小文字とする文字列 1 この関数は大文字に変換しました.
  4. 文字列内の文字の文字列にプログラムを書いた後、どのように多くの文字を数えます “の”.
  5. 文字列上でプログラムを書きます. それは、文字列をミラー化されているかどうかをチェック? 元の文字列のように後方にまだ書くときの対称性は、文字列の文字列です。. 最高経営責任者(CEO レベル
  6. 数字でプログラムを書きます 3 数字. 碑文は、その数の値を記述する言っ. 例 123 ->百と23.