为什么将此输出字符串转换为数字?

时间:2019-05-15 11:33:47

标签: c

我对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码,但我认为我错了。

3 个答案:

答案 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]);