我正在尝试编写一个函数来删除字符串中的空格,我知道我的问题是即使将下一个字符移动到空格所在的位置后,我仍然会将该字符复制到其原始位置(我两次重复一个角色)。我不太确定如何摆脱那个重复的角色。 (即我有“Hello world。”,但我的功能给了我“Hellowworld。”)
void deblank(char str1[], char str2[])
{
int i, x;
for (i = 0; str1[i] != '\0'; i++)
{
if (str1[i] == ' ')
{
x = i + 1;
str2[i] = str1[x];
}
else
{
str2[i] = str1[i];
}
}
str2[i] = '\0';
}
答案 0 :(得分:1)
目前,您只有一个索引i
。
你真的想要两个索引,称它们为i
和j
。 i
将成为源字符串的索引。 j
将成为目标字符串的索引。
您将首先浏览源代码字符串,就像现在一样,在每次迭代时递增i
。如果源中包含非空格字符,则会将其复制到目标位置,并递增目标索引。
如果源中有空格,则不会将其复制到目标或增加目标索引。
通常情况如下:
size_t j = 0;
for (i=0; input[i]; i++)
if (input[i] != ' ')
output[j++] = input[i];
output[j] = '\0';
是的,我会使用input
和output
或source
和dest
代替str1
和str2
。后者没有说明您要复制到哪个。
我还建议使用isspace
中的<ctype.h>
而不是直接与空格字符进行比较,除非您真的只想消除空格字符,但保留其他空格(制表符,回车符) ,新线,垂直标签等。)
答案 1 :(得分:1)
[edit]重写只使用1个字符串参数。
void deblank(char str[]) {
size_t x = 0;
for (size_t i = 0; str[i]; i++) {
if (str[i] != ' ') {
str[x++] = str[i];
}
}
str[x] = '\0';
}
答案 2 :(得分:1)
好的,这只是为了接受已接受答案的替代方法,主要是帮助您以更通用的方式解决问题。
#include <stdio.h>
/**
* char *remove_needles(char *dest, const char *haystack, const char *needles);
*
* puts in dest, all characters from haystack, that are not found in needles
*/
char *remove_needles(char *dest, const char *haystack, const char *needles)
{
const char *hp; /* this pointer will run through the haystack and is used to sort
* needles and hay
*/
char *dp; /* this pointer will point to the last character in dest */
const char *np; /* runs through the needles with the current */
dp = dest; /* to begin with the tail is the head :-) */
for (hp = haystack; hp != NULL && *hp != '\0'; hp++ ) {
for (np = needles; *np != '\0'; np++ ) {
if ( *hp == *np ) { /* is the current char at hp a needle? */
break; /* yep: let's break out of this loop it's a needle */
}
}
if ( *np == '\0' ) {
/* *np will only be '\0' if we ran through all the needles but
* the character at the pointer hp was not a needle
*/
*dp = *hp; /* so it's hay and we save it at the tail of dest */
dp++; /* and move the tail along */
}
}
return dest; /* we are all done and we return the result */
}
int main()
{
char src[] = "Hello World\n\tare you watching this?";
char dest[256]; /* this should have at least sizeof(src) space */
char white_spaces[] = " \t"; /* these are our needles, notice the space before \t */
remove_needles(dest, src, white_spaces);
printf("src: `%s'\ndest:`%s'\n", src, dest);
return 0;
}
你能将它扩展到一个拆分函数,它将来自haystack的子串放入一个数组中吗?首先将自己限制为10个子字符串,声明char dest[128][10];
然后尝试一下。
你怎么能避免像这样声明这个?我们知道可以占用的总内存不会比干草堆大,是否有可能在不手动计算的情况下将自己压得接近这个数量?
答案 3 :(得分:0)
你只是移动1个角色并留下其余部分 - 用'w'填充''。
从左向右移动,每次遇到空白时都需要将所有字符移到左侧。无论如何,这是个主意。
拥有2个字符串会更容易 - 也更快一点:源和目的地。
像这样:
char src[128] = "hello world and then some!";
char dest[128];
int destIndex = 0;
for (int i = 0; i < strlen(src); ++i)
{
if (src[i] != ' ')
dest[destIndex++] = src[i];
}
dest[destIndex] = 0; // make sure the new string is terminated
这样你就不必移动任何东西 - 只需将非空白字符移动到新字符串中,然后留下一个删除了所有空格的新字符串。
答案 4 :(得分:0)
code what ur written won't work when multiple spaces are there in between words.
int i, x=0;
for (i = 0; str1[i] != '\0'; i++)
{
if ((str1[i] == ' ')||(str[i] == '\t'))
{
continue;
}
else
{
str2[x] = str1[i];
x++;
}
}
str2[x] = '\0';
答案 5 :(得分:0)
这应该有效。
void deblank(char str1[], char str2[])
{
int i, j;
for (i = 0, j = 0; str1[i] != '\0'; i++, j++)
{
if (str1[i] == ' ')
{
i++;
str2[j] = str1[i];
}
else
{
str2[j] = str1[i];
}
}
str2[j] = '\0';
}
答案 6 :(得分:0)
更智能的方法是使用第二个计数器来跟踪输出数组中的当前位置。如果输入中的当前字符不是空格,则只复制到输出。
#include <stdio.h>
void deblank(char str1[], char str2[])
{
int i, j = 0; /* j points initially to the first element of str2, we only increment it if i doesn't point to space */
for (i = 0; str1[i] != '\0'; i++)
{
if (str1[i] != ' ') /* i doesn't point to a space char */
{
str2[j] = str1[i]; /* add the current char to str2, for the first iteration this is at position str2[0] */
j++; /* increment j++, so that the next time we encounter a non-space char, it is put in the next posisition */
}
}
str2[i] = '\0';
}
int main()
{
char input[20] = "Hey lo, World!";
char output[20] = "";
deblank(input, output);
printf("%s - %s\n", input, output);
return 0;
}
打印:
$ ./a.out
Hey lo, World! - Heylo,World!