scanf("%c",&ch)!=EOF
时间: 2024-01-02 19:01:48 浏览: 146
scanf("%c",&ch)!=EOF的意思是当输入的字符不等于文件结束标志EOF时,循环会继续执行。在C语言中,EOF的值为-1。所以当输入的字符不是EOF时,循环会一直执行下去。
范例:
```c
#include<stdio.h>
int main() {
char ch;
while(scanf("%c",&ch)!=EOF) {
printf("%c\n",ch+32);
}
return 0;
}
```
这段代码会不断读取输入的字符,并将字符转换为小写字母后输出。循环会一直执行,直到输入的字符为EOF(文件结束标志)为止。
相关问题
#include<stdio.h> void getFiveNum(int a[], FILE *fp); void position(int a[], int num, FILE *fp); int main() { FILE *fp = fopen("dict.dic", "r"); int a[6]; a[0] = 5; getFiveNum(a, fp); int num; scanf("%d", &num); position(a, num, fp); fclose(fp); return 0; } void getFiveNum(int a[], FILE fp) { int ch; for (int i = 1; i <= 5; i++) { ch = fgetc(fp); a[i] = 0; while (ch != 10) { a[i] = a[i] * 10 + (ch - '0'); ch = fgetc(fp); } } } void position(int a[], int num, FILE fp) { int ch, not1 = 0, not2 = 0, line = a[num], enter = 5, chNext; while (enter < a[num - 1]) { ch = fgetc(fp); if (ch == 10) enter++; } ch = fgetc(fp); chNext = fgetc(fp); while (enter < line) { if (not2 == 0 && ch == '/' && chNext == '/') { not1 = 1; }else if (not1 == 0 && ch == '/' && chNext == '') { not2 = 1; }else if (not1 == 1 && chNext == 10) { not1 = 0; ch = chNext; chNext = fgetc(fp); }else if (not2 && ch == '' && chNext == '/') { not2 = 0; ch = chNext; chNext = fgetc(fp); if (chNext == 10) { enter++; } ch = chNext; chNext = fgetc(fp); if (chNext == 10) enter++; } if (not1 == 0 && not2 == 0) { printf("%c", ch); } ch = chNext; chNext = fgetc(fp); if (chNext == 10) { enter++; }else if (chNext == EOF) { if (not1 == 0 && not2 == 0) { printf("%c", ch); break; } else { break; } } } if (not1 == 0 && not2 == 0 && chNext == 10) { printf("%c", ch); } }将子函数并到主函数里
以下是将子函数并到主函数的代码:
#include<stdio.h>
int main() {
FILE *fp = fopen("dict.dic", "r");
int a[6];
a[0] = 5;
int ch, not1 = 0, not2 = 0, line = a[num], enter = 5, chNext;
for (int i = 1; i <= 5; i++) {
ch = fgetc(fp);
a[i] = 0;
while (ch != 10) {
a[i] = a[i] * 10 + (ch - '0');
ch = fgetc(fp);
}
}
int num;
scanf("%d", &num);
while (enter < a[num - 1]) {
ch = fgetc(fp);
if (ch == 10) enter++;
}
ch = fgetc(fp);
chNext = fgetc(fp);
while (enter < line) {
if (not2 == 0 && ch == '/' && chNext == '/') {
not1 = 1;
} else if (not1 == 0 && ch == '/' && chNext == '') {
not2 = 1;
} else if (not1 == 1 && chNext == 10) {
not1 = 0;
ch = chNext;
chNext = fgetc(fp);
} else if (not2 && ch == '' && chNext == '/') {
not2 = 0;
ch = chNext;
chNext = fgetc(fp);
if (chNext == 10) {
enter++;
}
ch = chNext;
chNext = fgetc(fp);
if (chNext == 10) enter++;
}
if (not1 == 0 && not2 == 0) {
printf("%c", ch);
}
ch = chNext;
chNext = fgetc(fp);
if (chNext == 10) {
enter++;
} else if (chNext == EOF) {
if (not1 == 0 && not2 == 0) {
printf("%c", ch);
break;
} else {
break;
}
}
}
if (not1 == 0 && not2 == 0 && chNext == 10) {
printf("%c", ch);
}
fclose(fp);
return 0;
}
注意,将子函数并到主函数的代码,需要将子函数中的参数 FILE *fp 删除,并将 fp 声明为全局变量,否则会编译报错。
#include <stdio.h> int main() { FILE* fp; char ch = '\0', ch1 = '\0', ch2 = '\0'; int Part[6] = { 0 }, targetPart = 0,lines ,readedLines = 0; Part[0] = 5; scanf("%d", &targetPart); fp=fopen("dict.dic", "r"); fscanf(fp, "%d\n%d\n%d\n%d\n%d\n", Part + 1, Part + 2, Part + 3, Part + 4, Part + 5); lines = Part[targetPart]-Part[targetPart-1]; if (targetPart != 1){ char tem[99999]; for (int j = 0; j < Part[targetPart-1]-5; ++j) { fgets(tem,99998,fp); } } while (ch != EOF&&readedLines < lines) { ch = fgetc(fp); if (feof(fp)) return 0; if (ch == '/') { ch1 = ch; ch2 = fgetc(fp); if ( ch2 == '') { while (!feof(fp)) { ch2 = fgetc(fp); if (ch1 == '' && ch2 == '/') { ch1 = '\0'; ch2 = '\0'; ch = ch2; break; } ch1 = ch2; if (ch2 == '\n') { readedLines++; } if (readedLines > lines) return 0; } } else if ( ch2 == '/') { while (!feof(fp)) { ch = fgetc(fp); if (ch == '\n') { ch = '\0'; ch1 = '\0'; ch2 = '\0'; readedLines++; printf("\n"); break; } } } else { printf("%c%c", ch1, ch2); } } else { printf("%c", ch); } if (ch == '\n' || feof(fp) == -1) readedLines++; } fclose(fp); return 0; }给出每行注释
这是一个C语言程序,下面是每行的注释:
```c
#include <stdio.h> // 包含标准输入输出库的头文件
int main() { // 主函数
FILE* fp; // 文件指针
char ch = '\0', ch1 = '\0', ch2 = '\0'; // 用于读取文件中的字符
int Part[6] = { 0 }, targetPart = 0,lines ,readedLines = 0; // Part数组存储文件中每个部分的起始位置和行数,targetPart表示要读取的部分,lines表示该部分的行数,readedLines表示已读取的行数
Part[0] = 5; // Part数组的第一个元素为5
scanf("%d", &targetPart); // 从标准输入读取目标部分的序号
fp=fopen("dict.dic", "r"); // 打开文件dict.dic,以只读方式打开
fscanf(fp, "%d\n%d\n%d\n%d\n%d\n", Part + 1, Part + 2, Part + 3, Part + 4, Part + 5); // 读取文件中Part数组的值
lines = Part[targetPart]-Part[targetPart-1]; // 计算目标部分的行数
if (targetPart != 1){ // 如果目标部分不是第一部分
char tem[99999]; // 定义临时字符数组
for (int j = 0; j < Part[targetPart-1]-5; ++j) { // 跳过前面的部分
fgets(tem,99998,fp); // 读取一行字符
}
}
while (ch != EOF&&readedLines < lines) { // 循环读取文件中的字符,直到读取完目标部分的所有行
ch = fgetc(fp); // 读取一个字符
if (feof(fp)) return 0; // 如果到达文件结尾,则结束程序
if (ch == '/') { // 如果是注释符号
ch1 = ch; // 将注释符号赋值给ch1
ch2 = fgetc(fp); // 读取下一个字符
if ( ch2 == '') { // 如果下一个字符为空
while (!feof(fp)) { // 循环读取文件中的字符
ch2 = fgetc(fp); // 读取一个字符
if (ch1 == '' && ch2 == '/') { // 如果连续两个字符都是注释符号
ch1 = '\0'; // 清空ch1
ch2 = '\0'; // 清空ch2
ch = ch2; // 将下一个字符赋值给ch
break; // 跳出循环
}
ch1 = ch2; // 将ch2赋值给ch1
if (ch2 == '\n') { // 如果是换行符
readedLines++; // 已读取的行数加1
}
if (readedLines > lines) // 如果已读取的行数大于目标部分的行数
return 0; // 结束程序
}
} else if ( ch2 == '/') { // 如果下一个字符仍然是注释符号
while (!feof(fp)) { // 循环读取文件中的字符
ch = fgetc(fp); // 读取一个字符
if (ch == '\n') { // 如果是换行符
ch = '\0'; // 清空ch
ch1 = '\0'; // 清空ch1
ch2 = '\0'; // 清空ch2
readedLines++; // 已读取的行数加1
printf("\n"); // 输出换行符
break; // 跳出循环
}
}
} else { // 如果下一个字符不是注释符号
printf("%c%c", ch1, ch2); // 输出连续的两个字符
}
} else { // 如果不是注释符号
printf("%c", ch); // 输出该字符
}
if (ch == '\n' || feof(fp) == -1) // 如果是换行符或到达文件结尾
readedLines++; // 已读取的行数加1
}
fclose(fp); // 关闭文件
return 0; // 程序结束
}
```
阅读全文