这里是面试常见的字符串相关题目。
1. 删除字符串的空格,并返回空格的个数。
不断将后面非空格的字符拷贝到前面即可,这样子只需要遍历一次即可,返回值按照实际题目要求调整。
#include <stdio.h>
#include <string.h>
int delwhitespace(char *str)
{
char *tmp = str;
int ret = 0;
if (str == NULL) return ret;
while (*tmp != '\0') {
if (*tmp != ' ') {
*(str++) = *tmp;
}
else {
ret++;
}
tmp++;
}
*str = '\0';
return ret;
}
int main()
{
char a[] = "23 4 6 5";
char b[] = "234123345";
int num = 0;
num = delwhitespace(a);
printf("after: %s, num: %d\n", a, num); // 输出:after: 23465, num: 10
num = delwhitespace(b);
printf("after: %s, num: %d\n", b, num); // 输出:after: 234123345, num: 0
return 0;
}
2. 将字符串中连续的空格只保留一个
上面的题目的变体,只需要记录上一个字符是否是空格即可。如果遇到空格并且上一个字符不是空格,则赋值该空格,否则跳过。如果遇到非空格的字符,则清除该标志位。
#include <stdio.h>
#include <string.h>
void onewhitespace(char *str)
{
if (str == NULL) return ;
char *tmp = str;
char last_space = 0;
while (*tmp != '\0') {
if (*tmp != ' ') {
last_space = 0;
*(str++) = *tmp;
}
else {
if (!last_space) {
*(str++) = *tmp;
last_space = 1;
}
}
tmp++;
}
*str = '\0';
}
int main()
{
char a[] = " 2 3 4 6 ";
char b[] = " 2 3 4 6";
char c[] = "2346";
onewhitespace(a);
printf("after: $%s$\n", a); // 输出:after: $ 2 3 4 6 $
onewhitespace(b);
printf("after: $%s$\n", b); // 输出:after: $ 2 3 4 6$
onewhitespace(c);
printf("after: $%s$\n", c); // 输出:after: $2346$
return 0;
}
这里没有返回值,需要根据实际情况调整。