This question was migrated from Software Engineering Stack Exchange because it can be answered on Stack Overflow. Migrated7年前Learn more
空的空字符和换行字符在概念上有什么区别和相似之处
即介于“\0”和“\n”之间
您能解释一下它们与整数和字符数据类型变量和数组的相关性吗?
这里有一个例子供参考
读写二维字符数组的程序片段
程序代码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那样正常工作?

最佳答案

空字符'\0'和换行字符'\n'是两个不同的字符值,正如'x''y'是两个不同的字符值一样。
值为0的空字符用于标记字符串的结尾,C标准将其定义为“以第一个空字符结尾并包括第一个空字符的连续字符序列”。例如,返回字符串长度的strlen()函数,通过扫描字符序列直到找到终止的空字符。
换行符'\n'用于表示文本文件中行的结尾当程序运行时,字符串存在于内存中,并且在程序外部的文本文件中存在行。您可以将行(在文本文件中)的内容读入字符串(在内存中);根据读取方式的不同,生成的字符串可能包含也可能不包含终止'\n'。空字符通常不出现在文本文件中。
注意NULL是一个空指针常量除了空指针和空字符都可以表示为0之外,它们之间没有什么关系请不要使用术语NULL来指代空字符。
一个小问题是:在C语言中,字符常量如'x''\0''\n'实际上是int类型,而不是char类型(C++在这方面有所不同),但它们几乎总是用来表示类型char的值。例如,这:

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

将空字符值存储在c中,int值将隐式地从int转换为char在大多数情况下,你不必担心这个。
charint都是整数类型,您可以在它们之间自由转换。字符常量类型int的原因是历史的。
另外,我看到您使用的是旧式(K&R)函数定义。早在1989年,ANSI标准就添加了一种使用原型(实际上在代码中使用了一些原型)定义函数的新方法,此后C标准又有了两个新版本旧式函数定义已经过时,应该避免这:
int func(x, y)
int x;
char *y;
{
    /* ... */
}

是一个老式的定义。这:
int func(int x, char *y)
{
    /* ... */
}

是一个使用原型的定义,它是首选。首先,它允许编译器检查调用是否传递了正确数量和类型的参数。
在这之后你可能会有更多的问题。我强烈建议您看看comp.lang.c FAQ,它可能会回答大多数问题。

09-11 17:32
查看更多