使用 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;
}
}
运行 遇到使用 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;
}
}