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

时间:2017-02-13 20:06:57

标签: c string pointers

使用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 = '\0';
}

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

如果您不想使用标准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

答案 2 :(得分:0)

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;
        }

    }