C 删除字符数组中的非字母字符

C 删除字符数组中的非字母字符,c,arrays,C,Arrays,我想删除/替换字符数组中的非字母字符,但不是删除它,而是用空格替换它。 例如,如果我输入hello123hello,它将输出为hello hello。 我希望它以hellohello的形式输出,而不需要额外的空格 #include <stdio.h> #include <ctype.h> #include <string.h> int main() { char input[80]; char output[80]; printf(

我想删除/替换字符数组中的非字母字符,但不是删除它,而是用空格替换它。 例如,如果我输入hello123hello,它将输出为hello hello。 我希望它以hellohello的形式输出,而不需要额外的空格

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

int main()
{
    char input[80];
    char output[80];

    printf("> ");
    scanf("%s", &input);

    int i = 0;

    while (i < sizeof(input))
    { 
        if (input[i] != '\0' && input[i] < 'A' || input[i] > 'z')
          input[i] = ' ';
        {
            i++;
        }
    }

    printf("= %s\n", input);

    return 0;
}
#包括
#包括
#包括
int main()
{
字符输入[80];
字符输出[80];
printf(“>”);
scanf(“%s”,&input);
int i=0;
而(i'z')
输入[i]='';
{
i++;
}
}
printf(“=%s\n”,输入);
返回0;
}

如果确实要从数组中删除字符,则必须将索引较高的所有字符下移一步,以覆盖要替换的字符

如果你只是想打印结果,那么一次打印一个“通过”的字符,而不打印其余的字符会更容易


另外,您应该使用
中的
isalpha()
来检查字符是否为字母,您的代码非常不可移植,因为它假定编码有奇怪的地方。不要这样做。

你的第一项工作是用
替换
输入[i]<'A'| |输入[i]>'z'
!IsAlga(输入[i]):对于真正的可移植C和C++,不能假设ASCII编码,即使在ASCII中,大写和小写部分也不“触摸”。
如果你想真正删除字符,你应该向后循环运行。

你可能想考虑一种更为C++的方式来做:

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

using namespace std;

int main() {
    string s;
    getline(cin, s);
    s.erase(remove_if(begin(s), end(s), [](char c){ return !isalpha(c); }));
    cout << s << endl;
}
#包括
#包括
#包括消除输入上的长度超限问题
  • 检查字符是否按字母顺序排列
  • 这个成语为你处理棘手的左移

  • 您可以按如下方式修改程序:

    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    int main()
    {
        char input[80];
        char output[80];
    
        printf("> ");
        scanf("%s", &input);
    
        int i = 0;
        int j = 0;
    
        while (i < sizeof(input))
        {
            if (isalpha(input[i]))
            {
                input[j] = input[i];
                ++j;
            }
            ++i;
        }
    
        input[j-1] = '\0';
    
        printf("= %s\n", input);
    
        return 0;
    }
    
    #包括
    #包括
    #包括
    int main()
    {
    字符输入[80];
    字符输出[80];
    printf(“>”);
    scanf(“%s”,&input);
    int i=0;
    int j=0;
    而(i
    为什么要将
    i++
    放在花括号内?这里完全混淆了,因为它看起来像是多行
    if
    的一部分。你能不能让这个变得不可读?C还是C++?您实际使用的是哪一个?@EdHeal:A
    将出现语法错误。这是围绕
    i++
    的额外的、冗余的块范围,这太愚蠢了,我的头很痛。没有认真的,你可能会考虑阅读一本好的C++书籍,因为有很多与C++无关的东西。C样式字符串而不是
    std::string
    而不是
    。基本上不是C++。UVD:我不知道一个编码,它的大写字母和小写字母正好在一起。很小的注释:问题现在被标记为C++(它可能也被标记C++之前,不确定),所以也许<代码> <代码>而不是<代码> <代码>?@ AdvavoRy是的,但是我认为C++是一个错误标记。我不认为OP是使用C++的。@ unWrun-OP使用杂种C/C++。