我正在学习C文件操作,我有一个特定的问题,我需要将字母(A-Z,a-z)存储为从文件中读取的字符串。所以,如果我有abcd&*dvcd
,那么abcd
是一个字符串,dvcd
是一个字符串。
基本上我有两个问题:
我以为我会通过使用fscanf格式字符串来解决这两个问题。这是我的想法。我需要以某种方式跳过使用fscanf
格式字符串来查找我在文件中的位置。然后,我可以从保存的起始位置中减去找到我需要malloc
的字符串。然后,我malloc
特定长度的字符串,然后,我可以回到保存的位置并实际读取它。
但是,我不知道如何告诉fscanf
不存储扫描的字符串?
或者是否有其他方法允许跳过非字母字符?
答案 0 :(得分:0)
您可以使用格式说明符,例如"%[a-zA-Z]"在fscanf中的格式说明符。 如下例所示,
#include<stdio.h>
int main()
{
char a[10];
fscanf(stdin, "%[a-zA-Z]", a);
printf("%s\n",a);
}
在此示例中,它仅在stdin中读取字母。它会跳过非字母字符。
答案 1 :(得分:0)
自@ suresh&#39;答案是not working for me(输出应该是asd gddf
而不是asd asd
),我已经写了另一个版本,这个版本不是很短,但对我来说效果很好:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
int main(void) {
char ch;
while(scanf("%1c", &ch) == 1) { //while we have characters to read
if(isalpha(ch)) { // if the next one is alphanumeric
ungetc(ch, stdin); // we put it back
char str[101];
scanf("%100[a-zA-Z]", str); // to read the whole string (including that char)
printf("found string %s\n", str);
}
}
return 0;
}
Here是一个有效的例子。我使用stdin来做这个,但你可以很容易地使用它来使用你打开的另一个文件。我用于scanf
(%100[a-zA-Z]]
)的格式说明符意味着它应该只读取包含小写或大写字母的最多100个字符(str的大小)。 %1c
表示单个字符,unget
将字符放回缓冲区,以避免在不是符号的情况下跳过它。
编辑:正如@m-m所指出的,在方括号内使用-
不是标准的,在某些实现中可能不可用。如果您无法使用,则可以始终使用%100[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]
。