使用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';
}
答案 0 :(得分:1)
假设在此赋值中禁止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;
}
}