[申明] 本人第一次发表文章,这次代码可能写的有点复杂.不太尽如人意,如有大佬翻阅.请指出不足
[注]: 本代码仅限于有空格的字符串,包含几个空格都可以,本方法利用不断前后交换移出空格,完成字符串连续的打印,字符串长度等于移出空格后的长度.
例如:
首先,这里我们定义的字符串数组下标引用的是宏定义常量
#define MaxSize 30
1. 使用gets()函数进行输入字符串.
// 主函数
int main() {
char arr[MaxSize] = { 0 };
printf("请输入一串字符: ");
gets(arr);
Or_str(arr);
printf("移出空格后的字符串为%s\n", arr);
int len = strlen(arr); // 测试字符串长度,是否真的把空格删除了.
printf("字符串长度为: %d\n", len);
return 0;
}
2. 开始寻找在arr字符串中是否有空格,如果已经全部整理完,将会找到'\0', *arr==0,while表达式为假
退出循环.
void Or_str(char* arr) {
int cout = 0;
int cout1 = 0;
while (*arr) {
}
接下来是具体实现步骤:
在这里先进入while循环判断字符串是否含有空格: 一种是如果没有空格的情况,另一种是有空格的情况, 这里是没有空格的的情况下,应该向后偏移一个量来判断下一个字符.
while (*arr) {
//如果arr所指向不为空格的情况下,且下一个偏移的量不为\0的时候.
if (*arr != ' '&&*(arr+1)!='\0') {
arr++;
}
3.如果为空格*arr所指的字符为空格,那么将进行与后面的字符交换,*arr所指向也不会偏移,交换后再重新进入到while循环
如果类似于(i hj kh hj)这样交换后导致多个空格在一起的情况,这样将一直交换循环,永远不会进入不为空格的判断.这样使得*arr无法得到向后偏移.
所以这里我定义了cout , 进行计数,如果为空格判断是否下一个也为空格,如果不是退出循环,如果是,那么cout将++,直到下一个为字符,停止计数,
while (*arr == ' ') {
if (*(arr + 1) == ' ') {
arr++;
cout++;
}
else {
break;
}
}
在这里我先执行调换,防止cout为0时无法进入循环,如果cout次数大于0的情况下才进入判断进行--,等于0时无法再循环,cout==0时,但是还是有一次空格的 ,那就使用goto跳转再循环一次,为了防止cout为0一直循环,所以我放在了cout>0时候的判断里.
如果arr不往回偏移,字符只能与与前一个空格进行调换,所以arr往回偏移在进行交换,往回偏移的次数和cout是同步的.,所以先执行调换也是防止没交换.arr就往回偏移.
a:
//开始执行交换前后字符
do {
char c = *arr;
*arr = *(arr + 1);
*(arr + 1) = c;
//如果一个空格以上则执行此代码
if (cout > 0) {
cout--;
arr--;
if (cout == 0) {
goto a;
}
}
} while (cout);
完成交换后.cout为0的情况下跳出循环,回到while开始,重新执行调换判断.整体代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#define MaxSize 30 // 字符串最大容量
// 执行调换函数
void Or_str(char* arr) {
int cout = 0; // 判断空格计数器
while (*arr) {
//如果arr所指向不为空格的情况下,且下一个偏移的量不为\0的时候.
if (*arr != ' '&&*(arr+1)!='\0') {
arr++;
}
//如果arr指向为空格的情况下
else {
while (*arr == ' ') {
//如果arr指向的后面多个出现空格的时候空格
if (*(arr + 1) == ' ') {
arr++;
cout++;
}
else
break;
}
a:
//开始执行交换前后字符
do {
char c = *arr;
*arr = *(arr + 1);
*(arr + 1) = c;
//如果一个空格以上则执行此代码
if (cout > 0) {
cout--;
arr--;
if (cout == 0) {
goto a;
}
}
} while (cout);
}
}
}
// 主函数
int main() {
char arr[MaxSize] = { 0 };
printf("请输入一串字符: ");
gets(arr);
Or_str(arr);
printf("移出空格后的字符串为%s\n", arr);
int len = strlen(arr); // 测试字符串长度,是否真的把空格删除了.
printf("字符串长度为: %d\n", len);
return 0;
}