在C语言中,空字符和新行字符有什么区别?

在C语言中,空字符和新行字符有什么区别?,c,C,空字符和换行符在概念上有什么区别和相似之处 i、 介于“\0”和“\n”之间的e 您能否解释它们与整数和字符数据类型变量和数组的相关性 这里有一个例子供参考 读取和写入2d字符数组的程序片段 程序代码1: 上面的代码工作正常,而给出的相同逻辑略有不同,但没有给出适当的输出。这是密码 程序代码2: 在这里,同一程序的另一个实例没有给出下面给出的正确输出 程序代码3: 为什么程序代码2和程序代码3不如代码1的预期工作?程序2和3存在语法错误 带有十六进制值0x0a的“\n”通常用于格式化屏幕上的o/

空字符和换行符在概念上有什么区别和相似之处 i、 介于“\0”和“\n”之间的e 您能否解释它们与整数和字符数据类型变量和数组的相关性

这里有一个例子供参考 读取和写入2d字符数组的程序片段

程序代码1:

上面的代码工作正常,而给出的相同逻辑略有不同,但没有给出适当的输出。这是密码

程序代码2:

在这里,同一程序的另一个实例没有给出下面给出的正确输出

程序代码3:


为什么程序代码2和程序代码3不如代码1的预期工作?

程序2和3存在语法错误

带有十六进制值0x0a的“\n”通常用于格式化屏幕上的o/p文本文件,以便于阅读


十六进制值为0x00的“\0”是字符串分隔符。虽然NULL的数值为0x0000,但它的类型为void*

程序2和3,但存在语法错误

带有十六进制值0x0a的“\n”通常用于格式化屏幕上的o/p文本文件,以便于阅读


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

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

“\0”是整数0 “\n”是整数10


程序有错误

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

“\0”是整数0 “\n”是整数10

程序有错误

空字符“\0”和换行字符“\n”是两个不同的字符值,正如“x”和“y”是两个不同的字符值一样

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

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

请注意,NULL是一个扩展为NULL指针常量的宏。除了空指针和空字符都可以表示为0这一事实之外,它们之间几乎没有什么关系。请不要使用术语NULL来表示NULL字符

一件小事:在C语言中,字符常量如“x”、“0”或“\n”实际上是int类型,而不是char类型。C++在这方面有所不同。但它们几乎总是用来表示char类型的值。例如,这:

char c;
...
c = '\0';
将在c中存储空字符值,int值将从int隐式转换为char。在大多数情况下,你不必担心这一点

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


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

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

int func(int x, char *y)
{
    /* ... */
}
是一个使用原型的定义,它是首选。首先,它允许编译器检查调用是否传递了正确数量和类型的参数

在这之后你可能会有更多的问题。我强烈建议你看看;它可能会回答大多数问题。

空字符“\0”和换行字符“\n”是两个不同的字符值,就像“x”和“y”是两个不同的字符值一样

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

换行符“\n”用于表示文本文件中一行的结尾。程序运行时,内存中存在字符串,程序外部的文本文件中存在行。您可以将文本文件中一行的内容读入内存中的字符串;根据您的读取方式,生成的字符串可能是,也可能不是 包括终止的“\n”。空字符通常不会出现在文本文件中

请注意,NULL是一个扩展为NULL指针常量的宏。除了空指针和空字符都可以表示为0这一事实之外,它们之间几乎没有什么关系。请不要使用术语NULL来表示NULL字符

一件小事:在C语言中,字符常量如“x”、“0”或“\n”实际上是int类型,而不是char类型。C++在这方面有所不同。但它们几乎总是用来表示char类型的值。例如,这:

char c;
...
c = '\0';
将在c中存储空字符值,int值将从int隐式转换为char。在大多数情况下,你不必担心这一点

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


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

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

int func(int x, char *y)
{
    /* ... */
}
是一个使用原型的定义,它是首选。首先,它允许编译器检查调用是否传递了正确数量和类型的参数


在这之后你可能会有更多的问题。我强烈建议你看看;它可能会回答大多数问题。

在程序代码1中,如果我将“\0”替换为“\n”。 循环的j未被分隔

以下是修改的程序代码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键,第一个enter键将被读取为新行字符,并且 在读取字符数组时,输入的第二个enter将被读取为空字符

因此,只要连续输入第二个回车键,字符数组就应该停止读取。 我的意思是循环的内部j应该被终止
但是它会一直被读取,直到输入256个键。

在程序代码1中,如果我将'\0'替换为'\n'。 循环的j未被分隔

以下是修改的程序代码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键,第一个enter键将被读取为新行字符,并且 在读取字符数组时,输入的第二个enter将被读取为空字符

因此,只要连续输入第二个回车键,字符数组就应该停止读取。 我的意思是循环的内部j应该被终止
但是直到输入256个键,它才会被读取。

你为什么还在使用KNR C?@PrototypeStark这本书还是这门语言?这两种语言都有什么问题?为什么要使用旧的非标准语言?什么时候有标准编译器和语言标准?没什么错,只是不好practise@RobertHarveyK&R C已被弃用超过23年,我们拥有C11是有原因的。K&R这本书相对过时了,它涵盖了C89,而不是C99或C11以及各种勘误表和可以争议的风格问题。在2012,我们有更好的书可用,虽然我仍然认为K&R是一本伟大的书,或者至少我喜欢简洁的风格。NULL是空指针常数;它不应用于引用空字符“\0”。您为什么仍在使用KNR C?@PrototypeStark作为书本或语言?这两种语言都有什么问题?为什么要使用旧的非标准语言?什么时候有标准编译器和语言标准?没什么错,只是不好practise@RobertHarveyK&R C已被弃用超过23年,我们拥有C11是有原因的。K&R这本书相对过时了,它涵盖了C89,而不是C99或C11以及各种勘误表和可以争议的风格问题。在2012,我们有更好的书可用,虽然我仍然认为K&R是一本伟大的书,或者至少我喜欢简洁的风格。NULL是空指针常数;不应将其用于引用空字符“\0”。否“\n”仅为0x0A,而不是0x0d0aNULL是空指针常量。”\0'是空字符。它们是不同的东西。“\0”不是void*类型;我很好奇你是从哪里知道的\0',或0或0x00也可以用作空指针常量,但这与此处无关。“\n”不一定具有十六进制值0x0a。该标准没有指定使用哪个特定字符来表示换行符。它可能是ASCII“0x0d”或“0x0a”-也可能是完全不同的内容。C标准1999不强制要求ASCII。标准规定的是“\n”将放入一个字节。o/p是什么意思?否“\n”仅为0x0A,而不是0x0D0。Anull是一个空指针常量\0'是空字符。它们是不同的东西。“\0”不是void*类型;我很好奇你是从哪里知道的\0',或0或0x00也可以用作空指针常量,但这与此处无关。“\n”不一定具有十六进制值0x0a。该标准没有指定使用哪个特定字符来表示新林
E它可能是ASCII“0x0d”或“0x0a”-也可能是完全不同的内容。C标准1999不强制要求ASCII。标准上说的是“\n”可以放在一个字节中。o/p是什么意思?为什么你认为它们是用ASCII编码的?并不是所有的系统都使用ASCII,C标准也不需要。他没有使用标准C。我以前对他的问题发表过评论。老式的函数定义仍然是该语言的一部分,尽管它们从1989年就已经过时了。我在他的代码中看不到任何不标准的东西。甚至K&R1 C允许使用EBCDIC的ASCII-IBM大型机以外的字符集。您不太可能遇到一个系统,其中“\n”的值不是10,而是LF的ASCII/Latin-1/Unicode编码,但是记住可移植性很重要。为什么您认为它们是用ASCII编码的?并不是所有的系统都使用ASCII,C标准也不需要。他没有使用标准C。我以前对他的问题发表过评论。老式的函数定义仍然是该语言的一部分,尽管它们从1989年就已经过时了。我在他的代码中看不到任何不标准的东西。甚至K&R1 C允许使用EBCDIC的ASCII-IBM大型机以外的字符集。您不太可能遇到这样一个系统,其中“\n”的值不是10,而是LF的ASCII/Latin-1/Unicode编码,但请务必记住可移植性。需要注意的是,空终止符始终位于字符串中的换行符之后,即使换行符在字符串后面做一些事情。@LaurieStearn:我不确定这是什么意思,但我认为这是错误的。字符串根本不需要包含换行符-如果它包含换行符,则“\n”与任何其他字符一样是字符串的一部分,而不是在字符串后面。如果字符串包含换行符,则是。评论是关于问题本身的一般性质,而不是准则本身。可能还有另一个问题,但您能否确认在二进制流中使用fputwc在空终止符之后写入换行符实际上与在终止符之前的换行符具有相同的行为?记事本似乎不会将L'\n'解析为换行符BOM=BE。但N++确实如此。将空白字符从记事本复制到N++中得到LF。@ LauliStEng:在一个二进制流中,一个空字符不是一个终结符。要注意的是,null终止符总是跟随字符串中的换行符,即使换行符在字符串之后也有空格。@劳里斯滕:我不确定这意味着什么,但我认为这是错误的。字符串根本不需要包含换行符-如果它包含换行符,则“\n”与任何其他字符一样是字符串的一部分,而不是在字符串后面。如果字符串包含换行符,则是。评论是关于问题本身的一般性质,而不是准则本身。可能还有另一个问题,但您能否确认在二进制流中使用fputwc在空终止符之后写入换行符实际上与在终止符之前的换行符具有相同的行为?记事本似乎不会将L'\n'解析为换行符BOM=BE。但N++确实如此。将空白字符从记事本复制到N++中得到LF。@ LauliStEng:在二进制流中,空字符不是终结符。