在C语言中删除字符串间的空格

3
所以,我正在尝试从用户输入的字符串中删除空格。我已经有一个选项,可以计算元音字母并反转字符串。我需要帮助的那个是以//espaços开头的。我的做法是:如果“palavra”字符串(原始字符串)在任何位置上有一个空格(' '),则没有空格的新字符串将在该位置上具有来自字符串“palavra”的下一个字符:
/*palavra = " o  l  a  _  o  l  a"
             [0][1][2][3][4][5][6]
  palavra3 = "o  l  a  o  l  a"
             [0][1][2][3][4][5]*/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void) {
    char palavra[10];
    char palavra2[10];
    char palavra3[10];
    int i;
    int vogais = 0;
    int j;
    int k;
    int espaco = 0;

    printf("Introduza uma string: \n");
    scanf("%[^\n]", palavra);

    //vogais
    for (i = 0; palavra[i] != '\0'; i++) {
        if (palavra[i] == 'a' || palavra[i] == 'e' || palavra[i] == 'i' ||
            palavra[i] == 'o' || palavra[i] == 'u' ||
            palavra[i] == 'A' || palavra[i] == 'E' || palavra[i] == 'I' ||
            palavra[i] == 'O' || palavra[i] == 'U')
            vogais ++;
        // else
        //     printf("");
    }

    printf("Vogais: %i", vogais);

    //invertida
    for (i = 0; palavra[i] != '\0'; i++);
    {
        k = i-1;
    }
    for (j = 0; j <= i-1; j++) {
        palavra2[j] = palavra[k];
        k--;
    }

    printf("\nString invertida: %s", palavra2);

    //espaços
    for (i = 0; palavra[i]; i++) {
        if (palavra[i] == ' ')
            palavra3[i] = palavra[i + 1];
        //espaco++;
    }

    // printf("\nNumero de espacos: %i", espaco);
    printf("\nString sem espacos: %s", palavra3);
}

好奇的是,是谁或什么文本建议使用 scanf("%[^\n]", palavra); 而不是像 fgets(palavra, sizeof palavra, stdin); 这样的东西? - chux - Reinstate Monica
1
我尝试了两种方法,得到了相同的结果。我在学校学习C语言,是从老师的PDF文件中获取的。 - Nelson Silva
请使用int main而不是void main。因为后者自1990年发布的ISO C90标准以来已经被废弃。 - Roland Illig
2个回答

4

for (i = 0; palavra[i] != '\0'; i++);的结尾删除多余的;

由于多余的;,循环为空,以下代码执行一次,i等于strlen(palavra)

您可以通过使用Kernighan和Ritchie缩进风格来避免这种愚蠢的错误:将{放在带有ifforwhiledoswitch语句的行的末尾。这样做可以大大减少在控制语句和其块之间输入不必要的;的可能性。

使用两个手指方法来去除空格:

//espaços
for (i = j = 0; palavra[i]; i++) {
    if (palavra[i] != ' ') {
        palavra3[j++] = palavra[i];
    }
}
palavra3[j] = '\0';  // set the null terminator

@chux:感谢您的编辑,保持一致确实是黄金法则。 - chqrlie

2

保持一个新字符串长度k的计数器,检查一个字符是否为空格,如果是空格则忽略它,否则增加k并将该字符添加到新字符串中。例如 -

int k = 0;              //k will be the new string length after the loop
for (int i = 0; palavra[i] != '\0'; i++)
{
    if (palavra[i] != ' ')
    {
        palavra3[k++] = palavra[i];
    }
}
palavra3[k] = '\0';

这个示例也适用于多个连续空格的情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接