2

NULLのヌル文字と新しい行の文字、つまり「\0」と「\n」の概念的な違いと類似点は何ですか。整数と文字の両方のデータ型変数と配列の関連性を説明できますか?

参考までに、2D文字配列を読み書きするプログラムのスニペットの例を示します。

プログラムコード1:

int main()
{
    char sort(),stuname(),swap(),(*p)(),(*q)();
    int n;
    p=stuname;
    q=swap;
    printf("Let the number of students in the class be \n");
    scanf("%d",&n);
    fflush(stdin);
    sort(p,q,n);
    return 0;
}

char sort(p1,q1,n1)
char (*p1)(),(*q1)();
int n1;
{
    (*p1)(n1);
    (*q1)();
}

char stuname(int nos)  // number of students
{
    char name[nos][256];
    int i,j;
    printf("Reading names of %d  students started--->\n\n",nos);
    name[0][0]='k'; //initialising as non NULL charecter
    for(i=0;i<nos;i++)  // nos=number of students
    {
        printf("Give name of student %d\n",i);
        for(j=0;j<256;j++)
        {
            scanf("%c",&name[i][j]);
            if(name[i][j]=='\n')
            {
                name[i][j]='\0';
                j=257;
            }
        }
    }
    printf("\n\nWriting student names:\n\n");
    for(i=0;i<nos;i++)
    {
        for(j=0;j<256&&name[i][j]!='\0';j++)
        {
            printf("%c",name[i][j]);
        }
        printf("\n");
    }
}

char swap()
{
    printf("Will swap shortly after getting clarity on scanf and %c");
}

上記のコードはうまく機能していますが、わずかな違いで与えられた同じロジックは適切な出力を与えていません。これがコードです

プログラムコード2:

#include<stdio.h>
int main()
{
    char sort(),stuname(),swap(),(*p)(),(*q)();
    int n;
    p=stuname;
    q=swap;
    printf("Let the number of students in the class be \n");
    scanf("%d",&n);
    fflush(stdin);
    sort(p,q,n);
    return 0;
}

char sort(p1,q1,n1)
char (*p1)(),(*q1)();
int n1;
{
    (*p1)(n1);
    (*q1)();
}

char stuname(int nos)  // number of students
{
    char name[nos][256];
    int i,j;
    printf("Reading names of %d  students started--->\n\n",nos);
    name[0][0]='k'; //initialising as non NULL charecter
    for(i=0;i<nos;i++)  // nos=number of students
    {
        printf("Give name of student %d\n",i);
        ***for(j=0;j<256&&name[i][j]!='\0';j++)***
        {
            scanf("%c",&name[i][j]);

            /*if(name[i][j]=='\n')
            {
                name[i][j]='\0';
                j=257;
            }*/

        }
    }
    printf("\n\nWriting student names:\n\n");
    for(i=0;i<nos;i++)
    {
        for(j=0;j<256&&name[i][j]!='\0';j++)
        {
            printf("%c",name[i][j]);
        }
        printf("\n");
    }
}

char swap()
{
    printf("Will swap shortly after getting clarity on scanf and %c");
}

ここで、同じプログラムのもう1つのインスタンスが、以下に示す適切な出力を提供していません。

プログラムコード3:

#include<stdio.h>
int main()
{
    char sort(),stuname(),swap(),(*p)(),(*q)();
    int n;
    p=stuname;
    q=swap;
    printf("Let the number of students in the class be \n");
    scanf("%d",&n);
    fflush(stdin);
    sort(p,q,n);
    return 0;
}

char sort(p1,q1,n1)
char (*p1)(),(*q1)();
int n1;
{
    (*p1)(n1);
    (*q1)();
}

char stuname(int nos)  // number of students
{
    char name[nos][256];
    int i,j;
    printf("Reading names of %d  students started--->\n\n",nos);
    name[0][0]='k'; //initialising as non NULL charecter
    for(i=0;i<nos;i++)  // nos=number of students
    {
        printf("Give name of student %d\n",i);
        ***for(j=0;j<256&&name[i][j]!='\n';j++)***
        {
            scanf("%c",&name[i][j]);
            /*if(name[i][j]=='\n')
            {
                name[i][j]='\0';
                j=257;
            }*/
        }
        name[i][i]='\0';
    }
    printf("\n\nWriting student names:\n\n");
    for(i=0;i<nos;i++)
    {
        for(j=0;j<256&&name[i][j]!='\0';j++)
        {
            printf("%c",name[i][j]);
        }
        printf("\n");
    }
}

char swap()
{
    printf("Will swap shortly after getting clarity on scanf and %c");
}

プログラムコード2とプログラムコード3がコード1の期待どおりに機能しないのはなぜですか?

4

4 に答える 4

9

ヌル文字'\0'と改行文字'\n'は、'x''y'が 2 つの異なる文字値であるように、2 つの異なる文字値です。

値が 0 のヌル文字は、文字列の終わりを示すために使用されます。これは、C 標準によって「最初のヌル文字で終了し、最初のヌル文字を含む一連の連続した文字」と定義されています。たとえばstrlen()、文字列の長さを返す関数は、終端の null 文字が見つかるまで一連の文字をスキャンすることによって機能します。

改行文字 は'\n'、テキスト ファイル内の行の終わりを示すために使用されます。文字列はプログラムの実行中にメモリに存在し、はプログラムの外部のテキスト ファイルに存在します。行の内容 (テキスト ファイル内) を文字列 (メモリ内) に読み込むことができます。読み方によっては、結果の文字列に終端の が含まれる場合と含まれない場合があります'\n'。通常、テキスト ファイルではヌル文字は発生しません。

NULL(展開されるマクロ) がヌル ポインター定数であることに注意してください。ヌル ポインターとヌル文字の両方が として表現できるという事実を除けば0、それらは互いにほとんど関係がありません。NULLヌル文字を指す用語を使用しないでください。

ちょっとしたこと: C では、'x''\0'、 orなどの文字定数'\n'は、実際には 型intではなく 型charです。(C++ はこれが異なります。)しかし、ほとんどの場合、型の値を示すために使用されますchar。たとえば、次のようになります。

char c;
...
c = '\0';

は null 文字値を に格納しますcint値は暗黙的に から に変換さintcharます。ほとんどの場合、これについて心配する必要はありません。

charintはどちらも整数型で、自由に変換できます。文字定数が型である理由intは歴史的なものです。

また、古いスタイル (K&R) の関数定義を使用しているようです。さかのぼること 1989 年に、ANSI 標準はプロトタイプを使用して関数を定義する新しい方法を追加しました(コード内で実際にいくつかを使用します)。それ以来、C 標準には 2 つの新しいバージョンがありました。古いスタイルの関数定義は時代遅れであり、避けるべきです。これ:

int func(x, y)
int x;
char *y;
{
    /* ... */
}

は古いスタイルの定義です。これ:

int func(int x, char *y)
{
    /* ... */
}

はプロトタイプを使用する定義であり、推奨されます。1 つは、呼び出しが正しい数と型の引数を渡すことをコンパイラがチェックできるようにすることです。

この後、おそらくさらに質問があるでしょう。comp.lang.c FAQを参照することを強くお勧めします。それはおそらくそれらのほとんどに答えます。

于 2012-10-13T19:54:12.380 に答える
3

プログラム#2と#3には構文エラーがあります。

'\n'with Hex値0x0aは、読みやすくするために画面上のテキストファイルo/pをフォーマットするためによく使用されます。

16進値の「\0」0x00は文字列区切り文字です。NULLには数値がありますが0x0000、タイプはvoid*です。

于 2012-10-13T18:49:05.593 に答える
0

概念的には両方とも文字です。つまり、内部的にはASCIIでエンコードされています。

'\ 0'は整数0で、'\n'は整数10です。

プログラムにエラーがあります!

于 2012-10-13T18:50:35.020 に答える
0

プログラム コード 1 で、'\n' の代わりに '\0' を配置すると、j for ループが区切られていません。

以下は、変更されたプログラム コード 1 の一部です。

char stuname(int nos)  //nos: number students already read
{
    char name[nos][256];
    int i,j;
    printf("Reading names of %d  students started--->\n\n",nos);
    for(i=0;i<nos;i++)  
    {
        printf("Give name of student %d\n",i);
        ***for(j=0;j<256;j++)***
        {
            scanf("%c",&name[i][j]);

            if(name[i][j]=='\0')    // modified from if(name[i][j]=='\n')
            {

                j=257;
            }

        }
    }
    printf("\n\nWriting student names:\n\n");
    for(i=0;i<nos;i++)
    {
        for(j=0;j<256&&name[i][j]!='\0';j++)
        {
            printf("%c",name[i][j]);
        }
        printf("\n");
    }
}

Enter キーを 2 回押すと、最初の Enter キーは改行文字として読み取られ、
2 番目に入力された Enter キーは、char 配列の読み取り中に null 文字として読み取られます。

したがって、連続する 2 番目の Enter キーがキー入力されるとすぐに char 配列の読み取りが停止するはずです (つまり、内側の j for ループが終了する必要があります)。

于 2012-10-16T03:13:20.347 に答える