这个函数会改变数组的大小吗?

时间:2015-08-22 18:52:54

标签: c

所以我开始学习C.我正在学习经典的K& R书。在本书中,它们具有以下功能:

/*squeeze: delete all c from s */
void squeeze(char s[], int c)
{
    int i, j;

    for (i = j = 0; s[i] != '\0'; i++)
        if (s[i] != c)
            s[j++] = s[i];
    s[j] = '\0';
}

我的问题是:squeeze()实际上是否改变了s []中的字符数? 它似乎只是通过添加空字符来“切断”字符串的其余部分。是否存在超出数组中'\ 0'的其他值?

3 个答案:

答案 0 :(得分:3)

c中的字符串只是一个带有空终止符\0的字符数组,表示结束。在null终止符之后,字符仍然可以存在,但是使用c字符串的任何函数,即。 printfstrcpy将使用空终止符来标记结尾,因此有效地将其视为\0之后没有任何内容。

答案 1 :(得分:2)

squeeze()不会更改字符串中的字符数,它将查找作为第一个参数传递的字符串中作为第二个参数传递的字符并将其删除,然后使用{{终止字符串1}}。

在该字符之后,内存仍将分配给它的值,但C中的字符串相关函数将忽略它们。

答案 2 :(得分:0)

该参数声明为字符数组

char s[]

虽然它被调整为类型char * nevertheles的指针,但是假设该函数处理存储字符串的字符数组。

字符串是以零字符结尾的字符序列。

该函数从字符串中删除等于参数c指定的字符的字符。它只是覆盖这些字符并向左移动终止零。数组的大小不会改变。

因此,该函数会更改存储在数组中的字符串的长度,而不是数组本身的大小。

要确定字符串的长度,您应该使用标题strlen中声明的标准C函数<string.h>

考虑这个简单的程序

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

int main( void )
{
    char s[100] = "Hello World";

    printf( "The size of the array is %zu\n", sizeof( s ) );
    printf( "The length of the string in the array is %zu\n", strlen( s ) );
}

如果我在没有拼写错误的情况下正确输入程序,那么它的输出将是

The size of the array is 100
The length of the string in the array is 11