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

时间:2016-09-22 10:37:13

标签: c arrays

我想删除/替换char数组中的非字母字符,但不是删除它,而是用空格替换它。 举个例子,如果我输入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;
}

4 个答案:

答案 0 :(得分:3)

您可能想要考虑采用更多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;
}

请注意以下事项:

  1. string + getline消除了输入长度超支的问题。
  2. isalpha检查字符是否按字母顺序排列。
  3. erase-remove成语为你处理棘手的左移。

答案 1 :(得分:2)

如果你真的想从数组中删除字符,你将不得不将所有具有较高索引的字符向下移动一步,以覆盖要替换的字符。

如果你打算打印结果,那么一次一个地打印“传递”字符会更容易,并且不打印它们就可以抑制其余部分。

此外,您应该使用isalpha()中的<ctype.h>来检查字符是否是字母,您的代码非常不可移植,因为它假定编码有些奇怪。不要那样做。

答案 2 :(得分:0)

你的第一份工作是用input[i] < 'A' || input[i] > 'z'替换!isalpha(input[i]):对于真正的可移植C和C ++,你不能假设ASCII编码,即使在ASCII中,大写和小写部分也不是#34} ;触摸&#34;

如果你想实际删除字符,你应该向后运行循环。

答案 3 :(得分:0)

您可以像这样修改程序:

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