使用 C 中的指针在给定位置添加字符

Add character at given position using pointers in C

运行 遇到使用 C 中的指针在特定位置设置字符的问题。

代码准确地将字符放置在正确的位置,但该位置的当前字符没有被移动。

问题是在找到位置时跳过当前字母,但是在找到位置时在 IF 块中添加 *dest++ = *string 会导致程序停止。

示例: 字符串是 "bigmoney"。要添加的字母是 'X'。位置是3.

输出应该是"bigXmoney"

当前输出是 "bigXoney" 使用下面的代码。

如有任何建议,我们将不胜感激。谢谢!

更新代码:

void addLetter(char string[STRING_LENGTH], char letterToAdd, int pos)
{
    // store array in pointer
    char *stringHolder = string;
    char *dest = string;
    int posCounter = 0;

    // loop through string while not null
    while (*stringHolder) {
        // position found, add the character
        if (posCounter == pos) {
            *dest++ = letterToAdd;
        } else {
            *dest++ = *stringHolder;
        }

        // increment position counter
        posCounter++;

        // move the pointer position
        stringHolder++;
    }
    //reset stringholder pointer;
    *dest = '[=10=]';
}

简单的方法:Use std::string::insert.

假设std::string在此赋值中被禁止,从字符串的末尾开始并向后工作直到您通过pos将每个字符(包括空终止符)向上移动一个槽。现在您在 pos 处有一个空位,可以安全地写入新值。

如果您不想使用标准的 C 字符串函数,那么函数可以像下面这样

char * addLetter( char s[], char c, size_t pos )
{
    size_t i = 0;

    while ( i < pos && s[i] ) ++i;

    if ( i == pos )
    {
        do 
        {
            char tmp = s[i];
            s[i++] = c;
            c = tmp;
        } while ( c );

        s[i] = c;
    }

    return s;
}

如果你只需要在函数内部使用指针,那么它看起来像

char * addLetter( char s[], char c, size_t pos )
{
    char *p = s;

    while ( *p && p != s + pos  ) ++p;

    if ( p == s + pos )
    {
        do 
        {
            char tmp = *p;
            *p++ = c;
            c = tmp;
        } while ( c );

        *p = c;
    }

    return s;
}

这是一个演示程序

#include <iostream>

char * addLetter( char s[], char c, size_t pos )
{
    char *p = s;

    while ( *p && p != s + pos  ) ++p;

    if ( p == s + pos )
    {
        do 
        {
            char tmp = *p;
            *p++ = c;
            c = tmp;
        } while ( c );

        *p = c;
    }

    return s;
}

int main() 
{
    const size_t STRING_LENGTH = 10;
    char s[STRING_LENGTH] = "bigmoney"; 

    std::cout << s << std::endl;
    std::cout << addLetter( s, 'X', 3 ) << std::endl;


    return 0;
}

它的输出是

bigmoney
bigXmoney
shorter if memcpy is allowed.

  char * addLetter(char s[], char c, size_t pos)
    {
        int len = strlen(s);
        if (pos > len || len + 1 >= STRING_LENGTH)
            return NULL;
        else
        {
            **memcpy(s + pos + 1, s + pos, len - pos);
            s[pos] = c;**
            return s;
        }

    }