我想删除/替换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;
}
答案 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;
}
请注意以下事项:
string
+ getline
消除了输入长度超支的问题。isalpha
检查字符是否按字母顺序排列。答案 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;
}