sizeof 和 strlen 的printf 问题

 1 #include <stdio.h>
 2 #include <string.h>
 3
 4 int main(void){
 5     char temp[3];
 6     scanf("%s", temp);
 7     printf("%d\n", sizeof(temp));
 8     printf("%d\n", strlen(temp));
 9     printf("%s\n", temp);
10 }

编译时出错:

test_scanf.c: In function ‘main’:
test_scanf.c:7:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
  printf("%d\n", sizeof(temp));
  ^
test_scanf.c:8:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘size_t’ [-Wformat=]
  printf("%d\n", strlen(temp));
  ^

sizeof() 和 strlen() 返回值类型为size_t

In C99‘s *printf, z is a length modifier like h or l, not a conversion specifier like d or u.

将代码改为:

printf("%zu\n", sizeof(temp));
printf("%zu\n", strlen(temp));

另外:

strlen 计算到\0 出现为止。

sizeof 保证能容纳实现所建立的最大对象的字节大小。

时间: 2024-11-07 18:19:25

sizeof 和 strlen 的printf 问题的相关文章

C sizeof 和 strlen 的区别

首先 sizeof是操作符,strlen是函数,两者不在同一维度上. 其次 sizeof是操作符,返回一个对象或类型名的长度,不限定类型:strlen是<string.h>中计算C风格字符串长度的函数(只能是C风格字符串,C++的string类的对象都不行). 再次 单就C风格字符串来看 #include <stdio.h> #include <string.h> #define N 100 int main(void) {     char a[] = "a

C++Sizeof与Strlen的区别与联系

一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小.    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小.实际上,用sizeof来返回类型以及静态分配的对象.结构或数组所占的空间,返回值跟对象.结构.数组所存储的内容没有关系.    具体而言,当参数分别如下时,sizeof返回的值表示

C语言:内存地址分析 &amp; sizeof和strlen用法总结

还是在大学时代接触的C语言,当时学习数组.指针等概念时,怎一个"晕"字了得.最近在学习之余,疯狂地恶补了相关知识,故总结之,如有错误,请大家多多指点. 一. 内存地址分析 1) 先来看一个最基础的例子: int a[4]; 提问:&a[0],  a,  &a,  a+1,  &(a+1),  &a+1 分别表示什么? 咋一看,真的不知所措: 我们可以图解来分析它(假设下面的操作均在32为系统上面). 先来对上图进行简单的说明工作: 1. 紫色区域就是数组

sizeof与strlen的区别

本文列举了sizeof与strlen的区别,总结一下: sizeof()的结果是一个对象占用的字节数,对于字符串包括字符串结尾的\0. strlen()的结果不包括\0. 下面是源码: #include <stdio.h> int main() { int i = 0; char acNum[] = "12345"; ; char ac3Num[3] = "12"; char *pcNum = "12345" //printf(&qu

sizeof、strlen、字符串、数组,整到一块,你还清楚吗?

写在前面 sizeof.strlen.字符串.数组,提到这些概念,相信学过C语言的人都能耳熟能详,也能谈得头头是道,但是,在实际运用中,当这些内容交织在一起时,大家却不一定能搞地清清楚楚,本文的目的正是帮助大家将相关知识总结清楚. 正文 先看一段代码 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void testchar(char str[]) 5 { 6 printf("%d %d\n", sizeof(str

sizeof和strlen的区别

char str[20]="0123456789"; int   a=strlen(str); /*a=10;strlen 计算字符串的长度,以\0'为字符串结束标记. int   b=sizeof(str); /*b=20;sizeof 计算的则是分配的数组str[20] 所占的内存空间的大小,不受里面存储的内容影响 char *str1="absde"; char str2[]="absde";char str3[8]={'a',};char

【转】Sizeof与Strlen的区别与联系

一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小.    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小.实际上,用sizeof来返回类型以及静态分配的对象.结构或数组所占的空间,返回值跟对象.结构.数组所存储的内容没有关系.    具体而言,当参数分别如下时,sizeof返回的值表示

sizeof和strlen

Sizeof与Strlen的区别与联系 一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小.    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小.实际上,用sizeof来返回类型以及静态分配的对象.结构或数组所占的空间,返回值跟对象.结构.数组所存储的内容没有关系.    具体而言,当

sizeof 和strlen

当计算字符串的大小时,sizeof和strlen的区别: sizeof 包括字符结束标识符,strlen不包括. #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { int a[2] = {0,1}; char b[7] = "hellor"; int i = sizeof(a); int j = sizeof(a)/sizeof(a[0]); int m =