【发布时间】:2016-11-28 20:33:26
【问题描述】:
我正在从输入文件中读取文本。我必须将文本与分数分开,即
John Doe 100 95 67 85
jane doe 67 78 99
然后平均数字。我可以使用 strtok 用空格分隔,但我怎么知道我什么时候有一个整数?我需要将名称和整数的读取拆分为 2 个函数。我的阅读代码有效,但我需要在每个名称的末尾停下来。我尝试使用转换为字符串的数字并使用 strcmp 但它不起作用。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void read_reverse_write(FILE * ptr_file, FILE * op);
void write_and_avarage(int * fp, char * op);
//int checker(char *token);
int main(int argc, char** argv) {
FILE *fp;
FILE *op;
//opens quiz and checks and checks to make sure it did
fp = fopen("quiz.txt", "r");
if (fp == NULL) {
printf("Error opening file");
return (-1);
}
//opens op and checks that it did
op = fopen("output.txt", "w");
if (op == NULL) {
printf("Error opening file");
return (-1);
}
// runs read reverse write
read_reverse_write(fp, op);
fclose(fp);
fclose(op);
return (EXIT_SUCCESS);
}
void read_reverse_write(FILE * ptr_file, FILE * op) {
char buf[1000];
char *token;
const char delim[2] = " ";
fgets(buf, 1000, ptr_file);
token = strtok(buf, delim);
while (token != 100) {
fprintf(op, "%s ", token);
token = strtok(NULL, delim);
}
}
/*void write_and_avarage(int * fp, char * op) {
}
int checker(char *token) {
char *arr[102];
char ph[4];
for (int p = 0; p < 100; p++) {
if (p < 10) {
snprintf(ph, 1, "%d", p);
arr[p] = ph;
} else if (p < 99) {
snprintf(ph, 2, "%d", p);
arr[p] = ph;
} else if (p = 100) {
snprintf(ph, 3, "%d", p);
arr[p] = ph;
}
}
for (int z = 0; z < 100; z++) {
if (strcmp(token, arr[z]) == 1) {
return 1;
} else {
z++;
}
return 0;
}
}
*/
【问题讨论】:
-
检查 C 标准库中字符到 int 的转换。提示 atoi
-
试过我的编译器没有把它重新编译为一个有效的函数
-
如果您查看
strtok生成的每个令牌的第一个字符(如果不是NULL),您可以判断它是isalpha()还是isdigit()在第一种情况下构建名称,在第二个中,再记下一个分数。 -
hmmmm....你用的是什么编译器?你有试过了吗?
-
@WeatherVane 可以工作,但是如果我的令牌长度为 20 并且只有 12 个字符怎么办?我将如何实现这一点