gpt4 book ai didi

c - 从 C 中的 fscanf 字符串中删除特殊字符

转载 作者:行者123 更新时间:2023-12-05 01:34:43 25 4
gpt4 key购买 nike

我目前正在使用以下代码来扫描文本文件中的每个单词,将其放入一个变量中,然后在移动到下一个单词之前对其进行一些操作。这工作正常,但我试图删除所有不属于 A-Z/a-z. 的字符。例如,如果输入 "he5llo" 我希望输出是“你好”。如果我不能修改 fscanf 来做到这一点,有没有办法在扫描后对变量进行修改?谢谢。

while (fscanf(inputFile, "%s", x) == 1)

最佳答案

您可以将 x 赋给这样的函数。为了便于理解,第一个简单版本:

// header needed for isalpha()
#include <ctype.h>

void condense_alpha_str(char *str) {
int source = 0; // index of copy source
int dest = 0; // index of copy destination

// loop until original end of str reached
while (str[source] != '\0') {
if (isalpha(str[source])) {
// keep only chars matching isalpha()
str[dest] = str[source];
++dest;
}
++source; // advance source always, wether char was copied or not
}
str[dest] = '\0'; // add new terminating 0 byte, in case string got shorter
}

它将就地遍历字符串,复制匹配 isalpha() 的字符测试,跳过并因此删除那些没有的。要理解代码,重要的是要认识到 C 字符串只是 char 数组,字节值 0 表示字符串的结尾。另一个重要的细节是,在 C 中,数组和指针在很多(不是全部!)方面是一样的,所以指针可以像数组一样被索引。此外,这个简单的版本将重写字符串中的每个字节,即使字符串实际上并没有改变。


然后是一个功能更全的版本,它使用过滤器函数作为参数传递,并且只会在 str 更改时执行内存写入,并像大多数库字符串函数一样返回指向 str 的指针:

char *condense_str(char *str, int (*filter)(int)) {

int source = 0; // index of character to copy

// optimization: skip initial matching chars
while (filter(str[source])) {
++source;
}
// source is now index if first non-matching char or end-of-string

// optimization: only do condense loop if not at end of str yet
if (str[source]) { // '\0' is same as false in C

// start condensing the string from first non-matching char
int dest = source; // index of copy destination
do {
if (filter(str[source])) {
// keep only chars matching given filter function
str[dest] = str[source];
++dest;
}
++source; // advance source always, wether char was copied or not
} while (str[source]);
str[dest] = '\0'; // add terminating 0 byte to match condenced string

}

// follow convention of strcpy, strcat etc, and return the string
return str;
}

过滤函数示例:

int isNotAlpha(char ch) {
return !isalpha(ch);
}

调用示例:

char sample[] = "1234abc";
condense_str(sample, isalpha); // use a library function from ctype.h
// note: return value ignored, it's just convenience not needed here
// sample is now "abc"
condense_str(sample, isNotAlpha); // use custom function
// sample is now "", empty

// fscanf code from question, with buffer overrun prevention
char x[100];
while (fscanf(inputFile, "%99s", x) == 1) {
condense_str(x, isalpha); // x modified in-place
...
}

引用:

阅读int isalpha ( int c );手册:

Checks whether c is an alphabetic letter.
Return Value:
A value different from zero (i.e., true) if indeed c is an alphabetic letter. Zero (i.e., false) otherwise

关于c - 从 C 中的 fscanf 字符串中删除特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15865002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com