2014-02-15 59 views
0

这是代码:问题得到一个字符串的长度在C

void main() 
{ char strvek[500]; 

    printf("Mata in ett stort tal: "); 
    scanf("%s", &strvek); 

    size_t len1 = strlen(strvek); 
    printf("%d",&len1); 
} 

程序结束了打印LEN1的存储器ADRESS。我想在len1中存储字符串的长度。如果输入“hello”,我想用整数5作为例子。

+5

'的printf( “%つ\ n” 个,LEN1);'' – ouah

+0

scanf的( “%499 [^ \ n]的”,strvek);'' – BLUEPIXY

回答

2

“的地址”有你有你的代码问题:

  • scanf确实需要地址,但由于strvek是一个数组,它会逐渐“衰退”的指针传递给函数时比你的缓冲适用于缓冲区溢出
  • 用户可以输入更多字符,并且
  • printf并不需要一个地址int S(你的代码是未定义行为)

这里是你如何解决前两个问题:

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格式说明符(在这种情况下,您需要将指针转换为void*)之外不需要与符号。

+0

好的,谢谢,那多知道 – Tensora

+1

'&strvek' ....? – alk

+0

@alk你说得对,那是来自OP代码的复制粘贴。 – dasblinkenlight

-1

printf("%d",&len1)打印地址,而printf("%d",len1)打印长度本身。该&运营商意味着

+0

最size_t'肯定是* *长**,它肯定是**未签名**! – alk

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)

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); 
1

因为你是在输出打印len1的地址。 只需写:

printf("%d",len1); 
+0

'size_t'肯定是** long **,它肯定是** unsigned **! – alk