c语言将一个字符串(串长不超过50)中连续的空格符只保留一个

将一个字符串(串长不超过50)中连续的空格符只保留一个。例如,若字符串为“I am a student.",处理后为"I am a student."

#include <stdio.h>

int main() 
{
    char str[50];
    int i, j;
    char last_char = 'a'; 

    fgets(str, sizeof(str), stdin);

    for (i = 0, j = 0; str[i] != '\0'; i++) {
        if (str[i] != ' ' || last_char != ' ') { 
            str[j] = str[i]; 
            j++;
        }
        last_char = str[i];
    }
    str[j] = '\0'; 

    printf("%s", str);

    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7641034
  • 除此之外, 这篇博客: 位运算,字符串反转(c语言实现)中的 4. 有一个字符数组的内容为:“student a am i”, 请你将数组的内容改为"i am a student". 要求: 不能使用库函数。 只能开辟有限个空间(空间个数和字符串的长度无关)。 student a am i ,i ma a tneduts, i am a student 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    void reverse(char arr[], int left, int right){
    	int temp = 0;
    	while (left < right){
    		temp = arr[left];
    		arr[left] = arr[right];
    		arr[right] = temp;
    		left++;
    		right--;
    	}
    	}
    int main(){
    	char arr[] = "student a am i";
    	printf("初始字符串为:%s\n", arr);
    	int i = 0;
    	int left = 0, right = 0;
    	int len = strlen(arr) - 1;
    	reverse(arr, 0, len);        //交换整个字符串
    	while (i < len){
    		if (arr[i] != ' '){      //判定在遇到空格
    			left = i;
    			while (arr[i] && arr[i] != ' '){  //arr[i]存在且不是空格
    				i++;                          //一直加到第一个单词的最后一个字母
    			}
    			right = i - 1;
    		}
    		char temp = 0;
    		while (left < right){
    			temp = arr[left];
    			arr[left] = arr[right];
    			arr[right] = temp;
    			left++;
    			right--;
    		}                               //交换每个单词的字母
    		i++;
    	}
    	printf("改变后的字符串为:%s\n", arr);
    	system("pause");
    	return 0;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^