在c中获取字符串长度的问题

时间:2014-02-15 17:50:56

标签: c arrays strlen

这是代码:

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,例如。

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)打印长度本身。 &运算符表示“地址”