2014-10-28 60 views
-2

我在嘗試大寫第一個字母。這些字符是從文本文件中讀取的。不幸的是,我不能。我讀了一個想法,它說添加兩個布爾變量,它們可以是int類型的:噹噹前字符是單詞的一部分時,一個變量將保持1,而當前一個字符是單詞的一部分時,另一個變量將保持1。但是,我怎麼知道char是否是單詞的一部分呢?大寫文件中的第一個字母

#include <stdio.h> 

void cpt(char x[]); 

int main(){ 

    cptlz("in.txt"); 

    return 0; 
} 
void cptlz(char x[]){ 

    char ch; 

    int currentch, 
     previouschar, 
     st=1; 

    FILE *fptr_in; 

    if((fptr_in=fopen(x,"r"))==NULL){ 
     printf("Error reading file\n"); 
    } 
    else{ 
     while(st==1){ 
      st=fscanf(fptr_in,"%c",&ch); 
     if (ch >= 'a' && ch <= 'z'){ 
      printf("%c",ch-32); 
     } 
      else 
       printf("%c",ch); 
      } 
     } 
} 
+1

我建議你閱讀['fgets'](http://en.cppreference.com/w/c/io/fgets),['isspace'](http://en.cppreference。 com/w/c/string/byte/isspace)和['toupper'](http://en.cppreference.com/w/c/string/byte/toupper)。 – 2014-10-28 12:07:40

+0

一個簡單的方法是檢查前面的char是否是空格,換行符,特殊charakter,並且當前是一封信......這意味着您處於一個單詞的開頭(請小心,也是「。 ..一個詞「woukd導致」...一個字「) – Robert 2014-10-28 12:08:35

+0

想一想。首先確定哪些字符在文字中找到,哪些不是。 – 2014-10-28 12:08:43

回答

0

剛剛嘗試這個代碼..

void cptlz(char x[]){ 

char ch; 

int currentch, 
    previouschar='\n', 
    st=1; 

FILE *fptr_in; 

if((fptr_in=fopen(x,"r"))==NULL){ 
    printf("Error reading file\n"); 
} 
else{ 

    while((ch=fgetc(fptr_in))!=EOF){ 

    if (ch >= 'a' && ch <= 'z' && (previouschar=='\n' || previouschar==' ')){ 
     printf("%c",ch-32); 
    } 
     else 
      printf("%c",ch); 

    previouschar=ch; 
     } 

    } 
} 
+0

這不會「大寫每個單詞的首字母」,而是每行*的第一個字母。 – usr2564301 2014-10-28 12:31:23

+0

@Jongware試試編輯後的代碼.. – 2014-10-28 12:36:54

+0

OP沒有提及任何特定的「單詞」格式,所以以下可能是不必要的改進;但是你的代碼不會在括號之間大寫一個單詞的第一個字符。 (想想另一種方法來檢查,而不是添加'('到你的列表中,不用擔心,你在正確的軌道上。) – usr2564301 2014-10-28 12:40:56

0

字符是 「單詞的一部分」,並應資本化:

  1. 它是一個小寫字符a..z(爲此你可以,並且可能應該,使用標準庫函數islower)和
  2. 字符是而不是一封信 - 大寫或小寫(可以通過標準庫函數isalpha測試)。

所以你必須記住「最後的狀態」(遇到任何字母);當當前字符是另一個字母最後一個不是,你必須大寫。 (原則上,您可以使用isalpha這裏爲好,但你只需要檢查它是否是一個小寫字母因爲如果它已經是一個大寫的,你不必去改變它。)

輸出後字符(已更改或未更改),將其另存爲lastWasLetter的新狀態。我更改了原始previouschar的名稱和功能,因爲您不需要測試實際值 - 您只需知道它是否是字母。

#include <stdio.h> 
#include <ctype.h> 

void cptlz (const char *x); 

int main(){ 

    cptlz("in.txt"); 

    return 0; 
} 

void cptlz (const char *input_filename) 
{ 
    int ch, lastWasLetter = 0; 

    FILE *fptr_in; 

    fptr_in = fopen (input_filename,"r"); 
    if(fptr_in == NULL) 
    { 
     printf ("Error reading file '%s'\n", input_filename); 
     return; 
    } 
    while ((ch = fgetc (fptr_in)) != EOF) 
    { 
     if (!lastWasLetter && islower(ch)) 
      ch = toupper(ch); 
     printf ("%c",ch); 
     lastWasLetter = isalpha(ch); 
    } 
    fclose (fptr_in); 
}