# 410 ``` 410 請撰寫一程式,讓使用者輸入一個正整數,並讀取read.txt檔案內容,read.txt檔案中包含多列英文句子。若輸入值為n,則讀取n列read.txt檔案內容,將n列中的每個英文單字字首轉為大寫再輸出,並寫入至write.txt檔案。 輸入說明 一個正整數n,並讀取read.txt檔案內容 輸出說明 將n列中的每個英文單字字首轉為大寫再輸出,並寫入至write.txt檔案 範例輸入 5 範例輸出 Hello World! What Is The Weather Like Out There? Are You Ok? What's Today's Date? Excuse Me! #include <stdio.h> #include <string.h> #include <stdlib.h> #define LEN 100 void Capitalized(char *s, char *output); int main() { int n; scanf("%d", &n); FILE *fin = fopen("read.txt", "r"); FILE *fout = fopen("write.txt", "w"); char buf[LEN]; char output[LEN] = {'\0'}; //fscanf(fin, "%[^\n]%*c", buf); //%*[^\n]%*c for (int i=0; i<n; ++i) { fgets(buf, LEN, fin); //從fin最多取LEN個字元(包含'\0')到buf Capitalized(buf, output); printf("%s", output); fputs(output, fout); memset(output,0,LEN); } //while (fgets(buf, sizeof(buf), fin) ) //while (fgets(buf, LEN, fin) ) fclose(fin); fclose(fout); } void Capitalized(char *s, char *output) { for (int i=0; i<strlen(s); ++i) { if (s[0] != ' ') s[0]-=32; if (s[i] == ' ') s[i+1]-=32; output[i] = s[i]; } } #include <stdio.h> #include <string.h> #include <stdlib.h> #define LEN 1024 void Capitalized(char *s, char *output); int main() { int n; scanf("%d", &n); FILE *fin = fopen("read.txt", "r"); FILE *fout = fopen("write.txt", "w"); char buf[LEN]; char output[LEN] = {'\0'}; for (int i=0; i<n; ++i) { //跳過前n行 fscanf(fin, "%[^\n]%*c", buf); //%*[^\n]%*c //fscanf(fin, "%*[^\n]%*c"); } //while (fgets(buf, sizeof(buf), fin) ) while (fgets(buf, LEN, fin) ) //從fin最多取LEN個字元到buf { Capitalized(buf, output); printf("%s", output); fputs(output, fout); memset(output,0,LEN); } fclose(fin); fclose(fout); } void Capitalized(char *s, char *output) { int len=strlen(s); for (int i=0; i<len; ++i) { if (s[0] != ' ') s[0]-=32; if (s[i] == ' ') s[i+1]-=32; output[i] = s[i]; } } #include <stdio.h> #include <string.h> #include <stdlib.h> #define LEN 1024 void Capitalized(char *s, char *output); int main() { int n; scanf("%d", &n); FILE *fin = fopen("read.txt", "r"); FILE *fout = fopen("write.txt", "w"); char buf[LEN]; char output[LEN] = {'\0'}; for (int i=0; i<n; ++i) { fscanf(fin, "%[^\n]%*c", buf); //%*[^\n]%*c Capitalized(buf, output); printf("%s\n", output); fputs(output, fout); memset(output,0,LEN); } //while (fgets(buf, sizeof(buf), fin) ) fclose(fin); fclose(fout); } void Capitalized(char *s, char *output) { int len=strlen(s); for (int i=0; i<len; ++i) { if (s[0] != ' ') s[0]-=32; if (s[i] == ' ') s[i+1]-=32; output[i] = s[i]; } } #include <stdio.h> #include <string.h> #include <stdlib.h> #define LEN 1024 void Capitalized(char *s, char *output); int main() { int n; scanf("%d", &n); FILE *fin = fopen("read.txt", "r"); FILE *fout = fopen("write.txt", "w"); char buf[LEN]; char output[LEN] = {'\0'}; for (int i=0; i<n-1; ++i) { fscanf(fin, "%[^\n]%*c", buf); //%*[^\n]%*c Capitalized(buf, output); printf("%s\n", output); fputs(output, fout); memset(output,0,LEN); } fscanf(fin, "%[^\n]", buf); //%*[^\n]%*c buf[strlen(buf)-1] = '\0'; Capitalized(buf, output); printf("%s", output); fputs(output, fout); //memset(output,0,LEN); //while (fgets(buf, sizeof(buf), fin) ) fclose(fin); fclose(fout); } void Capitalized(char *s, char *output) { int len=strlen(s); for (int i=0; i<len; ++i) { if (s[0] != ' ') s[0]-=32; if (s[i] == ' ') s[i+1]-=32; output[i] = s[i]; } } "%n[a-z]" 读入最多n个字符,如果遇到非a-z的字符,停止 "%[^=]" 读入任意多的字符,直到遇到"="停止 对scanf(“%*[^\n]%*c”)解释: %〔^\n〕将逐个读取缓冲区中的’\n’字符之前的其它字符,%后面的*表示将读取的这些字符丢弃,前遇到’\n’字符时便停止读取操作,此时,缓冲区中尚有一个’\n’字符遗留,所以后面的%*c将读取并丢弃这个遗留的换行符,这里的星号和前面的星号作用相同。由于所有从键盘的输入都是以回车结束的,而回车会产生一个’\n’字符,所以将’\n’连同它之前的字符全部读取并丢弃之后,也就相当于清除了输入缓冲区。 https://blog.csdn.net/Veniversum/article/details/62048870 ```