C 如何检查输入文件是否包含字母或特定数字?
我一直在尝试验证输入文件。它有两个条件:C 如何检查输入文件是否包含字母或特定数字?,c,file,validation,C,File,Validation,我一直在尝试验证输入文件。它有两个条件: 它不能包含字母 文件中的数字必须在0到7的范围内-仅限整数 如果这两个条件都得到验证,我想打印出有效,如果没有,则在stderr上打印无效。程序运行不正常-我似乎从未得到有效的输出 FILE *r; r = fopen("soubor.txt", "r"); if (r == NULL) { fprintf(stderr, "File could not be opened\n"); } else {
0
到7
的范围内-仅限整数有效
,如果没有,则在stderr
上打印无效
。程序运行不正常-我似乎从未得到有效的输出
FILE *r;
r = fopen("soubor.txt", "r");
if (r == NULL) {
fprintf(stderr, "File could not be opened\n");
} else {
int c;
bool alpha = false;
bool outOfRange = false;
while ((c = fgetc(r)) != EOF) {
if (isalpha(c) != 0) {
alpha = true;
break;
}
if (c < 0 || c > 7) {
outOfRange = true;
break;
}
}
if (alpha == false && outOfRange == false) {
printf("Valid\n");
}
if (alpha == true || outOfRange == true) {
fprintf(stderr, "Invalid");
}
fclose(r);
}
文件*r;
r=fopen(“soubor.txt”,“r”);
if(r==NULL){
fprintf(stderr,“无法打开文件”\n);
}否则{
INTC;
布尔阿尔法=假;
bool outOfRange=false;
而((c=fgetc(r))!=EOF){
如果(isalpha(c)!=0){
α=真;
打破
}
如果(c<0 | | c>7){
outOfRange=true;
打破
}
}
if(alpha==false&&outOfRange==false){
printf(“有效\n”);
}
if(alpha==true | | outOfRange==true){
fprintf(标准“无效”);
}
fclose(r);
}
使用like(省略错误处理):
您的问题说明不完全清楚:
- 在文件中写入数字时,数字必须介于0到7之间-仅限整数。您是指数字还是数字,如
?那么10
呢01
0
内的非连续数字。7
以下是具有以下语义的修改版本:
#include <ctype.h>
#include <stdbool.h>
int main() {
FILE *r = fopen("soubor.txt", "r");
if (r == NULL) {
fprintf(stderr, "File could not be opened\n");
return 1;
}
bool valid = true;
bool last_is_digit = false;
int c;
while ((c = getc(r)) != EOF) {
if (isspace(c)) {
last_is_digit = false;
} else
if (!last_is_digit && c >= '0' && c <= '7') {
last_is_digit = true;
} else {
valid = false;
break;
}
}
if (valid) {
fprintf(stderr, "Valid\n");
} else {
fprintf(stderr, "Invalid\n");
}
fclose(r);
return 0;
}
#包括
#包括
int main(){
文件*r=fopen(“soubor.txt”,“r”);
if(r==NULL){
fprintf(stderr,“无法打开文件”\n);
返回1;
}
bool valid=true;
bool last_是_digit=false;
INTC;
而((c=getc(r))!=EOF){
if(i空间(c)){
最后一个字母是字母数字=假;
}否则
如果(!last_is_digit&&c>='0'&&c将01234
作为有效文件,或者这些数字是否需要分隔(由一个或多个非字母分隔)?例如,0,1.2 | 3:4
?关于00005 006
?isalpha(*input)
在默认情况下对char
进行签名时,平台上的负字符值具有未定义的行为。您应按以下方式转换char
参数:isalpha((未签名字符)*输入)
@chqrlie这是否只适用于ctype.h
函数?如果*input
为负会发生什么?这确实适用于
中的所有函数:它们的定义值与getc()的返回值相同
,类型为无符号字符的所有值加上负值EOF
,通常定义为(-1)
。这些函数通常定义为宏或内联函数,使用参数索引到根据当前区域设置确定的标志数组中。下面的EOF
负索引将指向数组外部,导致未定义的行为。让我指定一点。txt文件必须只包含0到7之间的数字-(0,1,2,3,4,5,6,7)这是一个有效输入文件的示例:67 1 4 2 5 0 6 1 4 4 0 4 0 0 2 1 0 4 0 4 4 6 1 1 2 7 1 0 4 2 3 1 2 3 3 1 5 2 0 4 5 5 4 4 4 4是一个有效的输入文件吗?0和1是有效的数字,但10
是一个大于7
的数字。数字是如何分开的?是e> -
允许使用字符?唯一有效的取消输出是0,1,2,3,4,5,6或7..No 10或00001等。所有数字基本上都是用空格分隔的2D数组。然后您应该只接受空格以及0
和7
之间的非连续数字和空格。我将更新我的答案。
FILE *fp = . . . ;
char *buf = malloc(n);
fread(buf, n, 1, fp);
fprintf(stderr, "%s", isValid(buf) ? "Valid" : "Invalid");
#include <ctype.h>
#include <stdbool.h>
int main() {
FILE *r = fopen("soubor.txt", "r");
if (r == NULL) {
fprintf(stderr, "File could not be opened\n");
return 1;
}
bool valid = true;
bool last_is_digit = false;
int c;
while ((c = getc(r)) != EOF) {
if (isspace(c)) {
last_is_digit = false;
} else
if (!last_is_digit && c >= '0' && c <= '7') {
last_is_digit = true;
} else {
valid = false;
break;
}
}
if (valid) {
fprintf(stderr, "Valid\n");
} else {
fprintf(stderr, "Invalid\n");
}
fclose(r);
return 0;
}