2

NULL一个空字符和一个换行符之间的概念区别和相似之处,即'\0' 和'\n' 你能解释它们与整数和字符数据类型变量和数组的相关性吗?

作为参考,这里是一个读取和写入 2d char 数组的程序示例片段

程序代码 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");
}

这里还有一个相同程序的实例没有给出下面给出的正确输出

程序代码 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'是两个不同的字符值一样。

值为 0 的空字符用于标记字符串的结束,C 标准将其定义为“以第一个空字符终止并包括第一个空字符的连续字符序列”。例如,strlen()返回字符串长度的函数通过扫描字符序列来工作,直到找到终止的空字符。

换行符 ,'\n'用于表示文本文件中的行尾。程序运行时字符串存在于内存中,而存在于程序外部的文本文件中。您可以将一行的内容(在文本文件中)读入字符串(在内存中);根据您阅读它的方式,生成的字符串可能包含也可能不包含终止的'\n'. 空字符通常不会出现在文本文件中。

请注意,它NULL是(扩展为的宏)空指针常量。除了空指针和空字符都可以表示为0之外,它们之间几乎没有任何关系。请不要使用该术语NULL来指代空字符。

一件小事:在 C 中,诸如 , 或 之类的字符常量'x'实际上'\0''\n'type int,而不是 type char。(C++ 在这方面有所不同。)但它们几乎总是用于表示 type 的值char。例如,这个:

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

将在 中存储一个空字符值c,该int值从 隐式转换intchar。在大多数情况下,您不必担心这一点。

charint都是整数类型,你可以在它们之间自由转换。字符常量是类型的原因int是历史性的。

另外,我看到您使用的是旧式 (K&R) 函数定义。早在 1989 年,ANSI 标准添加了一种使用原型定义函数的新方法(您实际上在代码中使用了一些原型)——从那时起就有了两个新版本的 C 标准。旧式函数定义已过时,应避免使用。这个:

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

是一个老式的定义。这个:

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

是一个使用原型的定义,它是首选。一方面,它让编译器检查调用是否传递了正确数量和类型的参数。

之后你可能会有更多的问题。我强烈建议您看一下comp.lang.c 常见问题解答;它可能会回答其中的大多数。

于 2012-10-13T19:54:12.380 回答
3

程序#2 和#3 存在语法错误。

'\n'十六进制值0x0a通常用于在屏幕上格式化文本文件 o/p,只是为了便于阅读。

带有十六进制值的 '\0'0x00是字符串分隔符。尽管 NULL 具有数值0x0000,但它的类型为void*

于 2012-10-13T18:49:05.593 回答
0

在程序代码 1 中,如果我放置 '\0' 而不是 '\n'。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 键,char 数组就应该停止读取。(我的意思是内部 j for 循环应该被终止)但是它会被读取直到 256 个键被键入。

于 2012-10-16T03:13:20.347 回答
0

从概念上讲,两者都是字符,这意味着它们在内部是 ascii 编码的。

'\0' 是整数 0,'\n' 是整数 10。

程序有错误!

于 2012-10-13T18:50:35.020 回答