我正在学习C语言,目前正在学习字符串处理。在我的学习材料中,
我在我的Windows(64位)机器上使用Dev-C++运行了此程序,并获得了以下输出结果:
在第一次调用strcmp()时,两个字符串是相同的——“Jerry”和“Jerry”,strcmp()返回的值为零。在第二次调用中,“Jerry”的第一个字符与“Ferry”的第一个字符不匹配,结果为4,这是ASCII值‘J’和‘F’之间的数字差值。在第三次调用strcmp()中,“Jerry”与“Jerry boy”不匹配,因为“Jerry”的末尾空字符与“Jerry boy”中的空格不匹配。返回的值为-32,这是空字符的值减去空格的ASCII值,即‘\0’减去‘ ’,等于-32。
为了确认该书的说法,我添加了这段代码到我的程序中,只是为了验证J和F之间的ASCII差异:
然后我相应地在输出中得到了这个 -
这是根据书上所说的,但是你可以看到,当字符串不匹配时,我得到了不同的j和k值。我查找了一些类似的SO问题,并且得到了其中一些,但无法得到关于不同输出(当它返回
strcmp()
被定义为:
这是一个比较两个字符串是否相同或不同的函数。两个字符串逐个字符进行比较,直到出现不匹配或其中一个字符串结束,以先出现的情况为准。如果两个字符串相同,则strcmp()返回值为零。如果它们不同,则返回第一组不匹配字符的ASCII值之间的数字差。
提供了一个示例程序,这就是我的问题所在-
main( )
{
char string1[ ] = "Jerry" ;
char string2[ ] = "Ferry" ;
int i, j, k ;
i = strcmp ( string1, "Jerry" ) ;
j = strcmp ( string1, string2 ) ;
k = strcmp ( string1, "Jerry boy" ) ;
printf ( "\n%d %d %d", i, j, k ) ;
}
我在我的Windows(64位)机器上使用Dev-C++运行了此程序,并获得了以下输出结果:
0 1 -1
现在,该书给出的输出结果为0 4 -32
,并给出了以下解释:在第一次调用strcmp()时,两个字符串是相同的——“Jerry”和“Jerry”,strcmp()返回的值为零。在第二次调用中,“Jerry”的第一个字符与“Ferry”的第一个字符不匹配,结果为4,这是ASCII值‘J’和‘F’之间的数字差值。在第三次调用strcmp()中,“Jerry”与“Jerry boy”不匹配,因为“Jerry”的末尾空字符与“Jerry boy”中的空格不匹配。返回的值为-32,这是空字符的值减去空格的ASCII值,即‘\0’减去‘ ’,等于-32。
为了确认该书的说法,我添加了这段代码到我的程序中,只是为了验证J和F之间的ASCII差异:
printf("\n Ascii value of J is %d", 'J' );
printf("\n Ascii value of F is %d", 'F' );
然后我相应地在输出中得到了这个 -
Ascii value of J is 74
Ascii value of F is 70
这是根据书上所说的,但是你可以看到,当字符串不匹配时,我得到了不同的j和k值。我查找了一些类似的SO问题,并且得到了其中一些,但无法得到关于不同输出(当它返回
1和-1 时)的明确答案,因此我决定提出新问题。
这个here问题似乎有些相似,问题描述包含有关strcmp()
的以下信息-
如果找到s1(或其前n个字节)分别小于、等于或大于s2,则strcmp()和strncmp()函数返回小于、等于或大于零的整数
在其中一个答案中,我遇到了this link,其中记录了strcmp()
的功能。它进一步说道-
strcmp()函数将比较s1指向的字符串和s2指向的字符串。非零返回值的符号将由两个字符串中不同的第一对字节(均解释为unsigned char类型)的值之差的符号确定。完成后,如果s1指向的字符串大于、等于或小于s2指向的字符串,则strcmp()将返回大于、等于或小于0的整数。因此,阅读所有这些内容后,我倾向于认为无论使用哪种实现/平台,都应该仅将strcmp()函数的返回值视为三个类别之一(0、正数和负数),而不是依赖于确切的返回值。我的理解是否正确?