这是代码:
void main()
{ char strvek[500];
printf("Mata in ett stort tal: ");
scanf("%s", &strvek);
size_t len1 = strlen(strvek);
printf("%d",&len1);
}
程序结束打印len1的内存地址。我想在len1中存储字符串的长度。如果输入“hello”,我想要整数5,例如。
答案 0 :(得分:2)
您的代码存在问题:
scanf
确实会占用地址,但由于strvek
是一个数组,因此它会衰减"传递给函数时的指针printf
不需要int
的地址(您的代码有未定义的行为)以下是解决前两个问题的方法:
scanf("%499s", strvek); // Limit the size to 499 chars + '\0'; no ampersand in front of strvec
以下是解决上一个问题的方法:
printf("%d", len1); // No ampersand
首先要记住何时使用带有I / O功能的&符号可能有点困难。通常,请记住scanf
除字符串外需要&符号,printf
除%p
格式说明符外不需要&符号(在这种情况下,您需要将指针转换为{{1} }})。
答案 1 :(得分:1)
因为您在输出中打印len1
的地址。
只需写下:
printf("%d",len1);
答案 2 :(得分:0)
人们在其他答案(目前为止)中未提及的是scanf
希望您传递值的地址,而printf
希望您自己传递值的原因。
在某种意义上,没有技术原因导致printf
无法设计为将地址带到要打印的值。如果这是惯例,printf
只会查找该地址的内容(使用指针取消引用运算符,*
)...并打印它。
但有两件事:
printf
。 C喜欢尽可能避免额外的步骤。printf
。您无法撰写printf("Value is %d", &10);
并打印Value is 10
。这可以通过创建一个变量来存储值并传递变量的地址来解决......但正如我刚才所说,C喜欢避免额外的步骤。然而,对于scanf
,是技术原因,为什么需要地址,而不是值。它需要接收放置数据的位置,以便调用者可以稍后查看该数据。
scanf
都必须继续...它将如何获得它读回给你的值?
(在这里的特定示例中,有一个字符数组,关于地址运算符缺乏必要性存在一个微妙的问题:请参阅How come an array's address is equal to its value in C? ...但忽略它并专注于概念的整数示例。:-P)
答案 3 :(得分:0)
应该是
char strvek[500];
[...]
scanf("%s", strvek);
更好的做法
scanf("%499s", strvek);
防止缓冲区溢出。
当scanning in a "string",即char
数组传递给数组本身scanf()
时,让数组衰减为指向其1 st 元素的指针,这使得不必使用&
(地址)运算符。
要print out a size_t
typed variable执行:
size_t len = ...;
printf("%zu", len1);
答案 4 :(得分:-1)
printf("%d",&len1)
打印地址,而printf("%d",len1)
打印长度本身。 &
运算符表示“地址”