【问题标题】:Why this output string to number?为什么这个输出字符串要编号?
【发布时间】:2019-05-15 11:33:47
【问题描述】:

我对 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("string1 %d", string1);  //output: 6356750
printf("string2 %d", string2);  //output: 6356748

为什么会有这样的数字?这些数字是什么意思?

我以为字符串数组中的数字代表 ASCII 码,但我想我错了。

【问题讨论】:

  • 您的标题和您所说的问题(在第一句话中)完全具有误导性。你根本不会问任何关于strcmp 的问题。请花一些时间阅读the help pages,阅读the SO tour,阅读有关how to ask good questions,以及this question checklist
  • 对不起,请道歉。当然我的意思是: printf("在 str1 和 str2 之间比较:%d, %d", strcmp(string1, string2));
  • 我已经更新了我的问题
  • printf("Compare between str1 and str2: %d, %d", strcmp(string1, string2)):这是错误的,你的格式字符串有两个%ds,但你只提供了一个参数(strcmp(string1, string2))。你的编译器可能警告过你。

标签: c


【解决方案1】:

请编译完整的警告!请务必仔细阅读这些警告!

编译器应该告诉你你的格式字符串是错误的。

printf 中的 % 参数描述了您提供的变量的类型。他们不提供任何“免费”的类型转换,只提供格式化,所以你有字符串,你需要使用%s

编译器试图做的是查看指向字符串的指针并将该指针值呈现为整数,但实际上如果整数的大小与指针的大小。

【讨论】:

    【解决方案2】:

    即使字符串包含数字,它们仍然是字符串,您需要使用"%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);
    

    【讨论】:

      【解决方案3】:
      printf("Compare between str1 and str2: %d, %d", string1, string2);
      

      通过这种方式,您可以在 string1 和 string2 的内存中打印地址,因为这是固定大小的数组

      要打印字符串,请使用%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]);
      

      【讨论】:

        猜你喜欢
        • 2013-02-20
        • 1970-01-01
        • 1970-01-01
        • 2020-01-10
        • 1970-01-01
        • 2020-03-01
        • 2014-08-23
        • 2015-11-09
        • 2013-02-27
        相关资源
        最近更新 更多