arrays - 使用sizeof将字符附加到字符串形式用户的末尾

标签 arrays c string character sizeof

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

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

    fgets( charArray, 20, stdin );

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

    printf( "%s", charArray );
}
但如果我输入: 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 );
}
但这是行不通的。因此,通过执行此操作,我消除了对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 );
}
但是我将来可能需要sizeof,所以我想知道我做错了什么。而且,与scanf相比,使用fgets和sizeof似乎更直接和简洁,并且使用神秘的[i-1]下标。 请给我有关sizeof方法的启发:我的代码有什么问题?

最佳答案

首先,char的大小始终为1,它是在规范中定义的。
其次,数组的大小是数组本身的大小,以“字节”为单位。
那意味着

sizeof( charArray ) / sizeof( charArray[ 0 ] )
等于
20 / 1
等于20
也就是说,您将始终写入数组的第二十一个元素,该元素超出范围并导致未定义的行为。
如果要将字符附加到字符串中,请使用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, ")");
}
或使用strlen获取字符串null终止符的位置并用char覆盖它(但请记住添加一个新的null终止符,并进行检查以免超出范围):
// 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';
}

关于arrays - 使用sizeof将字符附加到字符串形式用户的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63668844/

相关文章:

c - 通过C中的数组名称和指针访问2D数组元素

python - 计算落在一组 x、y、z 坐标之间的值的数量

php - 从 PHP 扩展中抛出异常而不是错误

C - 在一行中更改结构数组的所有值

c++ - 添加这些字符串有什么区别?

python - 强制 ElementTree 使用结束标签

java - 在使用变量时尝试在 "for"循环中确定 array.length

Javascript reduce push individual sums + final sum

objective-c - 如何创建指向结构的指针并对其进行类型转换?

android - Spanned 字符串的 getSpans 返回 Spanned 乱序?