如何用 "X" 替换前导或尾随空白字符
How to Replace Leading or Trailing Blank Characters with "X"
寻找一种更有效的方法来替换前导和尾随空 spaces (' '
) 并在每个空 space 的前面附加一个 'X'
。 . 它似乎适用于尾随 spaces,但我想知道是否有更好/更简单的方法来解决我所缺少的问题。
示例:
传入字符串:'12345 '
期望的结果 'XXXXX12345'
删除了 5 个空的 space 并在前面附加了 5 个 'X'
。
示例:
传入字符串:' 12345'
期望的结果 'XX12345'
删除 2 个空 space 并在前面附加 2 'X'
。
void fixStr(char* str)
{
int i = 0;
int length = strlen(str);
char strCopy[10];
strcpy(strCpy, str);
for(i = 0; i < length; i++)
{
if(strCopy[i] == ' ')
{
strCopy[i] = '[=11=]';
str[i] = '[=11=]';
break;
}
}
for(i = 0; i < length - i + 2; i++)
{
str[i] = 'X';
str[i + 1] = '[=11=]';
}
strcat(str, strCopy);
}
我没有修复您的代码,但您可以将 sprintf
与 isspace
结合使用,类似于此。另外,请记住为字符串末尾的 '[=13=]
创建一个 space。使用这个想法,它应该对你有帮助:
#include <ctype.h>
#include <stdio.h>
int main()
{
char buf[11];
char *s = "Hello";
int i;
sprintf(buf, "%10s", s); /* right justifies in a column of 10 in buf */
for(i = 0; i < 10; i++) {
if(isspace(buf[i])) /* replace the spaces with an x (or whatever) */
buf[i] = 'x';
}
printf("%s\n", buf);
return 0;
}
以工程师的方式解决问题:
- 定义需求。
- 了解你的工具。
- 使用尽可能简单、尽可能准确的工具来制定解决方案。
你的情况:
需要:
- 求出尾随空格的数量
- 将字符串的内容移到末尾
- 将开头设置为“X”
工具:
- 测量、迭代、比较和计数
- 移动一块内存
- 初始化一块内存
解决方案示例:
#include <string.h> /* for strlen(), memmove () and memset() */
void fix_str(char * s)
{
if ((NULL != s) && ('[=10=]' != *s)) /* Ignore NULL and empty string! */
{
/* Store length and initialise counter: */
size_t l = strlen(s), i = l;
/* Count space(s): */
for (; (0 != i) && (' ' == s[i-1]); --i); /* This for loop does not need a "body". */
/* Calculate the complement: */
size_t c = l - i;
/* Move content to the end overwriting any trailing space(s) counted before hand: */
memmove(s+c, s, i); /* Note that using memmove() instead of memmcpy() is essential
here as the source and destination memory overlap! */
/* Initialise the new "free" characters at the beginning to 'X's:*/
memset(s, 'X', c);
}
}
实现此目的的一种方法是找出字符串的前导非space位置和尾随非space位置,然后在中间移动内容(前导非space, trailing nonspace) this到字符串末尾,然后将开头的所有空space设置为'x'
这样你可以获得预期的输出(下面的函数)
void fixStr(char* str)
{
int i = 0;
int length = strlen(str);
int leadindex = length;
int tailindex = 0;
// First find the leading nonspace position
for(i = 0; i < length; i++)
{
if(str[i] != ' ')
{
leadindex = i;
break;
}
}
// if not found nonspace then no change
if( leadindex == length )
{
// all spaces, so no change required;
return;
}
// Find the trailing nonspace position
for(i = length - 1; i >= 0 ; i--)
{
if(str[i] != ' ')
{
tailindex = i;
break;
}
}
// move the buffer (in place) to exclude trailing spaces
memmove(str + (length - tailindex -1),str,(tailindex +1) );
// set the 'x' to all empty spaces at leading ( you may use for loop to set this)
memset(str, 'X', length - (tailindex - leadindex + 1) );
}
寻找一种更有效的方法来替换前导和尾随空 spaces (' '
) 并在每个空 space 的前面附加一个 'X'
。 . 它似乎适用于尾随 spaces,但我想知道是否有更好/更简单的方法来解决我所缺少的问题。
示例:
传入字符串:'12345 '
期望的结果 'XXXXX12345'
删除了 5 个空的 space 并在前面附加了 5 个 'X'
。
示例:
传入字符串:' 12345'
期望的结果 'XX12345'
删除 2 个空 space 并在前面附加 2 'X'
。
void fixStr(char* str)
{
int i = 0;
int length = strlen(str);
char strCopy[10];
strcpy(strCpy, str);
for(i = 0; i < length; i++)
{
if(strCopy[i] == ' ')
{
strCopy[i] = '[=11=]';
str[i] = '[=11=]';
break;
}
}
for(i = 0; i < length - i + 2; i++)
{
str[i] = 'X';
str[i + 1] = '[=11=]';
}
strcat(str, strCopy);
}
我没有修复您的代码,但您可以将 sprintf
与 isspace
结合使用,类似于此。另外,请记住为字符串末尾的 '[=13=]
创建一个 space。使用这个想法,它应该对你有帮助:
#include <ctype.h>
#include <stdio.h>
int main()
{
char buf[11];
char *s = "Hello";
int i;
sprintf(buf, "%10s", s); /* right justifies in a column of 10 in buf */
for(i = 0; i < 10; i++) {
if(isspace(buf[i])) /* replace the spaces with an x (or whatever) */
buf[i] = 'x';
}
printf("%s\n", buf);
return 0;
}
以工程师的方式解决问题:
- 定义需求。
- 了解你的工具。
- 使用尽可能简单、尽可能准确的工具来制定解决方案。
你的情况:
需要:
- 求出尾随空格的数量
- 将字符串的内容移到末尾
- 将开头设置为“X”
工具:
- 测量、迭代、比较和计数
- 移动一块内存
- 初始化一块内存
解决方案示例:
#include <string.h> /* for strlen(), memmove () and memset() */ void fix_str(char * s) { if ((NULL != s) && ('[=10=]' != *s)) /* Ignore NULL and empty string! */ { /* Store length and initialise counter: */ size_t l = strlen(s), i = l; /* Count space(s): */ for (; (0 != i) && (' ' == s[i-1]); --i); /* This for loop does not need a "body". */ /* Calculate the complement: */ size_t c = l - i; /* Move content to the end overwriting any trailing space(s) counted before hand: */ memmove(s+c, s, i); /* Note that using memmove() instead of memmcpy() is essential here as the source and destination memory overlap! */ /* Initialise the new "free" characters at the beginning to 'X's:*/ memset(s, 'X', c); } }
实现此目的的一种方法是找出字符串的前导非space位置和尾随非space位置,然后在中间移动内容(前导非space, trailing nonspace) this到字符串末尾,然后将开头的所有空space设置为'x'
这样你可以获得预期的输出(下面的函数)
void fixStr(char* str)
{
int i = 0;
int length = strlen(str);
int leadindex = length;
int tailindex = 0;
// First find the leading nonspace position
for(i = 0; i < length; i++)
{
if(str[i] != ' ')
{
leadindex = i;
break;
}
}
// if not found nonspace then no change
if( leadindex == length )
{
// all spaces, so no change required;
return;
}
// Find the trailing nonspace position
for(i = length - 1; i >= 0 ; i--)
{
if(str[i] != ' ')
{
tailindex = i;
break;
}
}
// move the buffer (in place) to exclude trailing spaces
memmove(str + (length - tailindex -1),str,(tailindex +1) );
// set the 'x' to all empty spaces at leading ( you may use for loop to set this)
memset(str, 'X', length - (tailindex - leadindex + 1) );
}