1

我有一个简单的问题要解决:

读取一个字符串,打印没有空格的字符串和空格的个数。

我可以使用 2 个字符串来执行此操作,一个将存储用户字符串,另一个将存储相同的字符串而没有空格。但我想只使用一个字符串来做到这一点。

到目前为止我所拥有的:

while(str[i] != '\0'){
        if(str[i] == ' '){
            contEsp += 1;
        }else{
            strcpy(&str[i - contEsp], &str[i]);
        }
        i++;
    }

问题:

它不计算空间的数量。

如果用户键入双倍或更多空格,则程序不计算在内,也不会删除空格。

问题:

我的代码有什么问题?

是否可以只使用一个字符串来做到这一点?

4

5 回答 5

4

试试这个代码:

int i = 0, contEsp =0;

while(str[i] != '\0')
{
    str[i-contEsp] = str[i];  

    if(str[i] == ' ')
      contEsp++;
    i++;       
}

str[i-contEsp] = '\0';

printf("String: %s, Spaces = %d\n",str, contEsp);
于 2013-06-07T14:00:51.250 回答
0

1)最后的空格也不要被剪掉。循环后添加检查和操作。

2)我建议划分局部空间计数器和全局空间计数器的概念。

unsigned int contEsp = 0;
unsigned int i = 0;
unsigned int localEsp = 0;

while(str[i] != '\0'){
    if(str[i] == ' '){
        contEsp += 1;
        localEsp += 1;
    }else if(contEsp) {
        strcpy(&str[i - localEsp], &str[i]);
        localEsp = 0;
        continue;
    }
    i++;
}

if ( localEsp > 0 )
    strcpy(&str[i - contEsp], &str[i]);
于 2013-06-07T13:48:38.737 回答
0

由于问题被标记为“性能”:您的方法是在遇到空格时复制整个剩余字符串。尽管这在现实中可能无关紧要,但这是低效的。只需逐个处理字符,例如:

unsigned remove_count_spaces(char *a) {
    char *b = a;
    unsigned ct = 0;

    do {
        if (*a == ' ') ct++;
        else *b++ = *a;
    } while(*a++);

    return ct;
}

...加上检查可能的环绕ct

于 2013-06-07T13:52:40.427 回答
0
char* RemoveAndCountSpaces(char* s)
{
    int contEsp = 0;
    char* x = s;
    char* org = s;

    while(*s != '\0'){
        if(*s == ' '){
            contEsp++;
        } else {
            *x = *s;
            x++;
        }
        s++;
    }
    *x = *s;

    printf("%s\nSpaces Found: %d\n", org, contEsp);
    return org;
}
于 2013-06-07T13:54:02.413 回答
0

我的代码有什么问题?
1. Count 未初始化为 0
2.strcpy(&str[i - contEsp], &str[i]);正在移动尚未处理的字符串,然后您i没有索引您认为的字符。

仅使用一个字符串就可以做到这一点吗?
是 - 下面

int CountAndBlank(char *str) {
  size_t x = 0;   /* index through un-spaced string */
  size_t i;       /* Index through original string */
  for (i = 0; str[i]; i++) {
    if (!str[i] == ' ') {
      str[x++] = str[i];
    }
  }
  str[x] = '\0';
  return i - x;  /* Spaces removed is the difference */
}

...
int Count = CountAndBlank(buf);
printf("Number of spaces removed from '%s' is %d\n", buf, Count);
于 2013-06-07T13:54:38.790 回答