在 C 中反转句子,单词之间只有一个空格字符

问题描述

我是 C 的新手,我正在尝试反转 C 中的字符串(字符指针)并将其存储在字符指针中。条件是倒置的句子不应该有任何尾随或前导空格,并且单词之间也不应该有超过一个空格。

示例:输入:“天空是”

预期输出:“si yks eht”

char * reverseWords(char * s){
    char* rev = malloc(24);

    int i=strlen(s)-1; int j = 0;
    for(; i>=0; i--){
    
        if(i == strlen(s)-1 && isalpha(s[i]) || i > 0 && (isalpha(s[i]) || s[i] == ' ' && isalpha(s[i-1]))){
            printf("i at pos: %d char: %c j:%d rev[j]: %c\n",i,s[i],j,rev[j]);
            rev[j++] = s[i];
            printf("j: %d rev[j]: %c\n",rev[j]);
        }
    }
    rev[j] = '\0';
   printf("After 1 rev:\"%s\"\n",rev);  
return rev;
}

我有几个问题:

  1. 我知道我的 if 条件逻辑不正确,您能帮我纠正吗?
  2. 此外,当我尝试打印 rev[j] 时,我得到了
i at pos: 13 char:   j:0 rev[j]: �
j: 1 rev[j]: �
i at pos: 12 char: s j:1 rev[j]: �
j: 2 rev[j]: �
i at pos: 11 char: i j:2 rev[j]: �
j: 3 rev[j]: �
....

我预计会出现段错误,但在初始化前后访问 rev[j] 时我看到无法识别的字符

  1. 我看过一些代码,它们以这种方式访问​​ malloced char 数组 --> *rev++ = *s++。正确的做法是什么?我什么时候应该使用索引 (rev[0]) 与指针访问 *rev = *s ?

编辑:按照我的逻辑工作,现在似乎正在工作:

char * reverseWords(char * s){
    
    char* rev = (char *)malloc((sizeof(char))*(1024);
    
    int i=0,j = 0,p =0;
    
    for(int i = strlen(s)-1; i>=0; ){
        while(i >=0 && s[i] == ' ')
            i--;
        
        j= i-1;
        
        while(j >= 0 && s[j] != ' ')
            j--;
        
        if(i >= 0 && j >=-1 ){
        for(int k=i; k > j; k--){
            rev[p] = s[k];
            
            p++;
        }
        rev[p++] = ' ';
        }
        
        i = j-1;
        
    }
   
    rev[p-1]='\0';

return rev;
}  
    

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)