使用 sizeof 将一个字符附加到字符串表单用户的末尾

She*_*uti 6 c arrays string character sizeof

我正在尝试使用以下代码将右括号附加到从用户那里获取的字符串的末尾

int main( void )
{
    char charArray[ 20 ];

    fgets( charArray, 20, stdin );

    charArray[ sizeof( charArray ) / sizeof( charArray[ 0 ] ) ] = ')';

    printf( "%s", charArray );
}
Run Code Online (Sandbox Code Playgroud)

但如果我输入:4+5输出只是:4+5而不是:4+5)

我什至尝试了以下变体,以防万一

int main( void )
{
    char charArray[ 20 ];
    int n;

    fgets( charArray, 20, stdin );

    n = sizeof( charArray ) / sizeof( charArray[ 0 ] );

    charArray[ n ] = ')';

    printf( "%s", charArray );
}
Run Code Online (Sandbox Code Playgroud)

但它不起作用。所以我通过做消除了对 sizeof 的需要

int main( void )
{
    char charArray[ 20 ];
    int i = 0;

    do{
        scanf( "%c", &charArray[ i ] );
        ++i;
    } while( charArray[ i - 1 ] != '\n' );

    charArray[ i - 1 ] = ')';

    printf( "%s", charArray );
}
Run Code Online (Sandbox Code Playgroud)

但是我将来可能需要 sizeof 所以我想知道我做错了什么。此外,fgets 和 sizeof 的使用似乎比 scanf 更直接和简洁,并且 do while 使用神秘的 [ i - 1 ] 下标。请告诉我有关 sizeof 方法的信息:我的一段代码有什么问题?

Som*_*ude 7

首先,大小char始终 1,它在规范中定义。

其次,数组的大小是数组本身的大小,以“字节”为单位。

这意味着

sizeof( charArray ) / sizeof( charArray[ 0 ] )
Run Code Online (Sandbox Code Playgroud)

等于

20 / 1
Run Code Online (Sandbox Code Playgroud)

这等于20

也就是说,您将始终写入数组的第 21 个元素,该元素越界并导致未定义的行为。

如果要将字符附加到字符串,请使用strcat将字符附加为字符串(确保不写越界):

// Check to make sure there's space in the array, the -1 is for the terminator
if (strlen(charArray) < (sizeof charArray - 1))
{
    strcat(charArray, ")");
}
Run Code Online (Sandbox Code Playgroud)

或用于strlen获取字符串空终止符的位置并用您的字符覆盖它(但请记住添加一个新的空终止符,并检查以免越界):

// Get the index of the current null-terminator in the string
size_t terminator_index = strlen(charArray);

// Check to make sure there's space in the array, the -1 is for the terminator
if (terminator_index < (sizeof charArray - 1))
{
    // Can append new character
    charArray[terminator_index] = ')';

    // Add terminator
    charArray[terminator_index + 1] = '\0';
}
Run Code Online (Sandbox Code Playgroud)