您可以像这样将
x
传递给一个函数。为了便于理解,下面是一个简单的版本:
#include <ctype.h>
void condense_alpha_str(char *str) {
int source = 0;
int dest = 0;
while (str[source] != '\0') {
if (isalpha(str[source])) {
str[dest] = str[source];
++dest;
}
++source;
}
str[dest] = '\0';
}
它将在原地处理字符串,拷贝符合
isalpha()
测试的字符,跳过并移除不符合条件的字符。要理解代码,重要的是要意识到C字符串只是具有字节值0表示字符串结尾的
char
数组。另一个重要细节是,在C中,数组和指针在许多(但不是全部)方面都是相同的东西,因此指针可以像数组一样进行索引。此外,即使字符串没有实际更改,这个简单版本也会重新编写字符串中的每个字节。
然后是一个更全面的版本,它使用作为参数传递的过滤函数,并且仅在str发生变化时才执行内存写入操作,并返回指向
str
的指针,就像大多数库字符串函数一样:
char *condense_str(char *str, int (*filter)(int)) {
int source = 0;
while (filter(str[source])) {
++source;
}
if (str[source]) {
int dest = source;
do {
if (filter(str[source])) {
str[dest] = str[source];
++dest;
}
++source;
} while (str[source]);
str[dest] = '\0';
}
return str;
}
示例过滤函数:
int isNotAlpha(char ch) {
return !isalpha(ch);
}
示例调用:
char sample[] = "1234abc";
condense_str(sample, isalpha);
condense_str(sample, isNotAlpha);
char x[100];
while (fscanf(inputFile, "%99s", x) == 1) {
condense_str(x, isalpha);
...
}
参考文献:
阅读int isalpha ( int c );手册:
检查c是否为字母。
返回值:
如果c确实是字母,则返回一个非零值(即true)。否则返回零(即false)。
fscanf
存在一个大问题:它可能会导致缓冲区溢出。当你有char x[100]
时,你应该总是使用例如fscanf(inputFile, "%99s", x)
。 - hyde