в верхний регистр каждого слова в файле в C - PullRequest
0 голосов
/ 03 мая 2020

Можете ли вы сказать мне, какие настройки я могу сделать для своего кода или какие-либо упрощения? Что я не должен повторять, что я должен изменить? Этот код преобразует каждое слово в верхний регистр, если вы обнаружите некоторые проблемы, пожалуйста, напишите, чтобы исправить это))

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int main(){
    FILE * fPtr, *fPtr1;
    int c; /*to store characters*/
    char filename[20];
    char filename2[20] = "temp.txt";
    printf("Enter name of file: ");
    scanf("%19s%*c",filename);
    fPtr = fopen(filename, "r");
    fPtr1 = fopen(filename2, "w");
    c = fgetc(fPtr);
    while(c!=EOF){
        if(c!='\n'){
            if(islower(c)){
                fputc(c-32,fPtr1);
            }else{
                fputc(c,fPtr1);
            }
        }else{
            fputc(c,fPtr1);
        }
        c = fgetc(fPtr);
    }
    fclose(fPtr);
    fclose(fPtr1);
    remove(filename);
    rename(filename2,filename);
    fPtr = fopen(filename, "r");
    c = fgetc(fPtr);
    while(c!=EOF){
        printf("%c",c);
        c = fgetc(fPtr);
    }
    fclose(fPtr);
}

Ответы [ 2 ]

0 голосов
/ 03 мая 2020
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX 20

char *mygets(char *s, size_t sz) {
  int ch;
  size_t i = 0;

  while((ch = getchar()) != '\n' && i < sz)
    s[i++] = ch;

  s[i] = '\0';

  return s;
}

int main(void) {
  FILE *fPtr;
  char filename[MAX+1];
  int c, i;

  printf("Enter name of file: ");
  mygets(filename, MAX+1);

  if(!strstr(filename, ".txt"))
    strcat(filename, ".txt");

  if((fPtr = fopen(filename, "r+")) == NULL) {
    fprintf(stderr, "Could not open %s\n", filename);
    exit(1);
  }

  i = 0;
  while((c = fgetc(fPtr)) != EOF) {
    fseek(fPtr, i, SEEK_SET);
    fputc(toupper(c), fPtr);
    i++;
  }

  rewind(fPtr);

  while((c = fgetc(fPtr)) != EOF)
    putchar(c);

  fclose(fPtr);

  return 0;
}
0 голосов
/ 03 мая 2020

Эта программа делает то, что вы говорите, она делает. Но я рекомендую некоторые изменения, которые оценят ваши будущие личности.

Во-первых, всегда инициализируйте ваши переменные; эта привычка поможет предотвратить нечетные ошибки в вашем будущем коде. Установите int s на значение вне ожидаемого диапазона (например, возможно -1 в этом случае); установите указатели на NULL; установите для char массивов { '\0' } или "\0".

Затем проверьте указатели файлов (fPtr, fPtr1) для NULL после fopen.

Наконец, указав c к этому коду, ваша проверка на новую строку не нужна; islower вернет 0, если параметр не является строчным буквенным символом c.

...