我对c中的strcmp函数有疑问。作为家庭作业,我们会对字符串进行一些比较。但是尚不清楚,我们必须将数字与该函数进行比较。我知道还有其他比较数字的比较方法,但是我们的教授是这样使用的。
当我使用这样的函数时:
char string1[] = "1";
char string2[] = "2"
printf("Compare between str1 and str2: %d, %d", strcmp(string1, string2));
->输出:
Compare between str1 and str2: 1
这意味着string1更大。
然后我只有带有变量的printf:
printf("string1 %d", string1); //output: 6356750
printf("string2 %d", string2); //output: 6356748
为什么会有这样的数字?这个数字是什么意思?
我当时认为字符串数组中的数字代表ASCII码,但我认为我错了。
答案 0 :(得分:5)
请编译完整警告!务必仔细阅读这些警告!
编译器应该告诉您格式字符串错误。
printf中的%参数描述您要提供的变量的类型。它们不提供任何“免费”类型转换,仅提供格式设置,因此,当您有字符串时,需要使用%s
编译器尝试做的是查看指向您的字符串的指针,并将该指针值呈现为整数,但实际上,如果整数的大小与整数的大小不同,它甚至无法正确执行此操作。指针的大小。
答案 1 :(得分:4)
即使字符串包含数字,它们仍然是 字符串 ,并且您需要使用"%s"
格式打印它们:
printf("Compare between str1 and str2: %s, %s", string1, string2);
// ^^ ^^
// Note the format specifier being different
对于所打印的“数字”,请记住数组会衰减到指向其第一个元素的指针。这是您要打印的那些指针的十进制值。
应注意,使用不匹配的格式说明符和参数(例如使用"%d"
打印字符串)会导致undefined behavior。
如果您想使用实际数字,并将其与例如<
或>
,则应该改用数字类型,如
int number1 = 1;
int number2 = 2;
然后,您可以使用"%d"
格式说明符来打印它们,因为它需要一个int
类型的参数:
printf("Compare between number1 and number2: %d, %d", number1, number2);
答案 2 :(得分:0)
printf("Compare between str1 and str2: %d, %d", string1, string2);
这样,您就可以在堆栈的字符串1和字符串2的内存中打印地址,因为这是固定大小的数组
要打印字符串,请使用%s
:
printf("Compare between str1 and str2: %s, %s", string1, string2);
但是此字符串必须以null('\ 0')终止,否则函数将在内存中读取直到找到值为0的单元格为止。
要查找CHAR的ASCII码(不是整个字符串),请使用以下代码:
printf("first char of str1: %c = %d", string1[0], (int)string1[0]);