出于好奇:
#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()
)来返回正确的值吗?
答案 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例:
printf()
失败并返回-1 @Ben。作为SIZE_MAX
比较的一部分,此-1将转换为if (printf("%s", mysterious_string) != strlen(mysterious_string))
。
strlen(mysterious_string) > INT_MAX
。 printf()
会返回int
,但字符串可能会更长。 strlen()
会返回size_t
,某些无符号类型可能会超出int
的正范围。
"%s"
转换超出了环境限制,结果可能会有所不同。 scanf("%s", mysterious_string);
不受此限制。
任何单次转换可以产生的字符数至少为4095.C11dr§7.21.6.115
FWIW,使用通常\n
- &gt;打印在Windows机器上打印。即使已将2个字符写入文件,\r\n
文本模式转换仍会从fprintf(text_file, "%s", "\n")
返回1。