C语言利用指针删除空格 (打印连续字符串)

[申明] 本人第一次发表文章,这次代码可能写的有点复杂.不太尽如人意,如有大佬翻阅.请指出不足

[注]: 本代码仅限于有空格的字符串,包含几个空格都可以,本方法利用不断前后交换移出空格,完成字符串连续的打印,字符串长度等于移出空格后的长度.

例如: 

 

首先,这里我们定义的字符串数组下标引用的是宏定义常量

#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;
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值