printf()返回可以与strlen()不同吗?

时间:2016-08-30 18:45:19

标签: c string

出于好奇:

#include <stdio.h>
#include <string.h>

enum { BIG_NUMBER = 1024 };

int main(void)
{
    char mysterious_string[BIG_NUMBER];

    if (scanf("%1023s", mysterious_string) == 1) {

        if (printf("%s", mysterious_string) != strlen(mysterious_string)) {
            // Can this state occur?
        }
    }
    return 0;
}

内心可以&#39;如果&#39;回归真的吗?我可以盲目地信任这两个函数(printf()strlen())来返回正确的值吗?

2 个答案:

答案 0 :(得分:6)

绝对不同。

如果strlen失败(由于多种原因),则会返回一个负数,该数字与scanf返回的值不同。在所有其他情况下,它将是相同的。

注意:这假设字符串为空终止且logger.handlers=SENTRY_HANDLER logger.level=WARN handler.SENTRY_HANDLER=com.getsentry.raven.jul.SentryHandler handler.SENTRY_HANDLER.properties=dsn,tags handler.SENTRY_HANDLER.tags=tag1\:value1,tag2\:value2 handler.SENTRY_HANDLER.dsn=https\://test\:test@app.getsentry.com/test 按预期工作。

答案 1 :(得分:4)

  

'if'可以返回true吗?我可以盲目地相信这两个函数来返回正确的值吗?

是的,它可以返回true(不相等) 可信任这两个函数以使用兼容的编译器和兼容代码返回“正确”值。然而,这两个函数的“正确”值可能不同。

至少3例:

    由于I / O错误或其他原因,
  1. printf()失败并返回-1 @Ben。作为SIZE_MAX比较的一部分,此-1将转换为if (printf("%s", mysterious_string) != strlen(mysterious_string))

  2. strlen(mysterious_string) > INT_MAXprintf()会返回int,但字符串可能会更长。 strlen()会返回size_t,某些无符号类型可能会超出int的正范围。

  3. "%s"转换超出了环境限制,结果可能会有所不同。 scanf("%s", mysterious_string);不受此限制。

  4.   

    任何单次转换可以产生的字符数至少为4095.C11dr§7.21.6.115

    FWIW,使用通常\n - &gt;打印在Windows机器上打印。即使已将2个字符写入文件,\r\n文本模式转换仍会从fprintf(text_file, "%s", "\n")返回1。