0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

main()
{
    char str[5]={'\0'};
    printf("Initial length before passing = %ld\n",strlen(str));
    input(str);
    printf("Received string = %s\n",str);
    printf("Length after getting input(calling function) = %ld\n",sizeof(str));
}

input(char * buffer)
{
    puts("Enter something: ");
    printf("Initial length after passing = %ld\n",strlen(buffer));

    if ( fgets(buffer, sizeof(buffer), stdin) == NULL )
        return -1;
    else
    {
        printf("Length after getting input(called function)= %ld\n",strlen(buffer));
        return 0;
    }
}

输出 1

Initial length before passing = 0
Enter something: 
Initial length after passing = 0
hello
Length after getting input(called function)= 6
Received string = hello

Length after getting input(calling function) = 5

输出 2

Initial length before passing = 0
Enter something: 
Initial length after passing = 0
helloooooo
Length after getting input(called function)= 7
Received string = hellooo
Length after getting input(calling function) = 5

为什么当我给出不同的输入时它会打印不同的长度?

  1. 在输出 1 和 2 中,当我只为 5 个字符分配空间时,为什么初始长度为 6?
  2. 为什么传入输出 1 和输出 2 之前和之后的字符串长度不同?
  3. 在输出 2 中,当我只分配较少的空间时,为什么“获得输入后的长度(称为函数)= 7”?
4

3 回答 3

2

strlen应该使用 C 字符串,即以 . 结尾的字符数组\0。当你定义:

char str[5];

str包含垃圾,你很幸运调用strlen没有导致分段错误。

于 2013-06-23T02:16:00.853 回答
1
char str[5];
printf("Initial length before passing = %ld\n",strlen(str));

strlen返回指定字符串的长度,而不是缓冲区的大小。你没有初始化str任何东西,所以它充满了垃圾。 strlen将返回该垃圾的“长度”,可以是任何东西。

于 2013-06-23T02:18:01.697 回答
1

1) 在输出 1 和 2 中,为什么当我只为 5 个字符分配空间时初始长度为 6?

strlen(str)自从您声明char str[5]但没有将任何内容放入其中以来,您的第一个电话甚至都没有真正定义。所以内容是谁知道的。返回 6 的事实strlen(str)只是意味着内存中碰巧有 6 个非零字符,从str遇到 0 之前的地址开始。

2)为什么在传递输出1和输出2之前和传递之后字符串的长度不同?

在为随机内存内容获得长度为 6 后,您将某些内容加载到字符串缓冲区中并以零终止它。所以长度变成了真实的东西。

3) 在输出 2 中,当我只分配较少空间时,为什么“获得输入后的长度(称为函数)= 7”?

因为您实际上用更长的字符串(长度为 7)超出了分配的空间。你很幸运,在那种情况下程序没有崩溃。

当你在 C 中声明一个缓冲区时,例如:

char str[5];

它所做的只是告诉编译器您要保留 5 个字节的空间来做某事,并且它授权您使用该空间并且仅将该空间用于str. 除非您将某些内容放在那里,否则它不一定要在缓冲区中启动任何内容,并且它不会阻止您写入超出您声明的内容。

请注意,str[5]它不足以容纳“hello”,因为 C 中的字符串是以零结尾的。所以你需要一个大小为 N+1 的字符缓冲区来保存一个大小为 N 的字符串。当你在 C 中溢出缓冲区时,你的结果将变得不稳定和不可预测。

于 2013-06-23T02:23:04.173 回答