2016-10-07 9 views
0

いくつかのコードで動作します。私は初心者ですので、おそらく超複雑な構文は理解できません。質問には、ユーザーから読み込まれた文字列があります。 "cat dog"とプログラムはそれをパスカルの場合に変更します。 "CatDog"あなたが見ることができるように、各単語の最初の文字は大文字にされ、スペースは削除されます。それは私が問題を抱えている場所です、私はスペースを削除する方法を把握することはできません。私は一時配列を入れることを考えましたが、スコープの問題のために新しい文字列配列を返すことはできません。前もって感謝します。また、私は関数内にとどまる必要があり、新しい関数を作成することはできません。あなたは以下の私のコードを試すことができます文字列をパスカルの場合に変更します。

#include <stdio.> 
#include <stdlib.h> 
#include <string.h> 

char toUpperCase(char ch){ //changes char to uppercase 
return ch - 'a'+ 'A'; 
} 

char toLowerCase(char ch){//changes char to lower case 
return ch -'A'+'a'; 
} 


void PascalCase(char* word){//"cat dog" "CatDog" 
/*Convert to Pascal case 
It is safe to assume that the string is terminated by '\0'*/ 
char temp[100];//do not know how to implement 
int i; 
if (word[0] >= 97 && word[0] <= 122) { 
    word[0] = toUpperCase(word[0]); 
} 
    for (i = 1; i < strlen(word); ++i) { 
     if (word[i] >= 65 && word[i] <= 90) { 
      word[i] = toLowerCase(word[i]); 
     } 
     if (word[i] == ' '){ 
      ++i; 
      if (word[i] >= 97 && word[i] <= 122) { 
       word[i] = toUpperCase(word[i]); 
      } 
     } 
    } 

} 



int main(){ 
char word[100]; 
printf("Enter phrase:"); 
fgets(word, 100, stdin); 

/*Call PascalCase*/ 
PascalCase(word); 

/*Print new word*/ 
printf("%s\n", word); 
return 0; 
} 
+1

"スコープの問題により、新しい文字列配列を返すことができません"。動的メモリ割り当てを使用することができます。 'char * temp = malloc(100);'ただし、不要になったときにメモリが解放されるようにしてください。もう一つの共通の慣用句は、関数が呼び出し元が渡すバッファポインタを取り込むことです。 – kaylum

+1

は、65または97のような魔法の数字を使用しません。 '' a''と '' A''は意図をはるかに明確に示し、 a〜zが連続している限り、任意の文字セット –

答えて

0

は:

inline char toUpperCase(char c){ 
    if('a'<=c && c<='z') return c-'a'+'A'; 
    else return c; 
    } 
    inline char toLowerCase(char c){ 
    if('A'<=c && c<='Z') return c-'A'+'a'; 
    else return c; 
    } 
    void toPascalCase(char *str){ 
    int i,j=0; bool first=true; 
    for(i=0;str[i];i++){ 
     if(str[i]==' ') {first=true; continue;} 
     if(first) {str[i]=toUpperCase(str[i]); first=false;} 
     else str[i]=toLowerCase(str[i]); 
     str[j++]=str[i]; 
    } 
    str[j]='\0'; 
    } 

文字列の長さを増加させないスペースを削除し、操作は場所で行うことができますので。また、ケースチェックをtoUpperCase機能に移しましたので、使いやすくなっています。それをインライン化することで、より迅速な実装が可能になります。私はさまざまな入力を試しました。 "cat dog"または "cat dog"であり、コードは常に "CatDog"(パスカルの場合)を与えます。ブール変数firstは、現在の文字がスペース(大文字にする必要がある単語の先頭)の後の最初の文字かどうかを示します。

+0

単語の先頭にない文字が確実に小文字に変換されるように、 'toLowerCase'関数を追加しました。これで、このコードは "cAt doG"のような入力に対して機能します。しかし、「cat-dog」では、「dog」の「d」は大文字に変換されません。あなたは "Cat-dog"を手に入れます。これがあなたにとって問題ないのか分かりません。 –

0

既に利用可能な既存の機能を利用するアプローチがあります。 「機能の中にいなければならず、新しい機能を作成できない」ということは、そのアプローチを無効にしないことを意味するはずです。選択された文字列は、舌であることを意図しています。

編集:cdlaneで指摘されているように、strlwrは利用できない非標準機能です。私は代替案を追加しました。

#include <stdio.h> 
#include <stdlib.h> 

void str2lower(char *input) 
{ 
    int i=0; 
    while (input[i]) 
    { 
     input[i] = tolower(input[i]); 
     ++i; 
    } 
} 

// returns a new string - caller responsible for freeing the memory 
char *pascalCase(char *input) 
{ 
    // create a copy of the string, since strtok modifies its input 
    char *tmp = strdup(input); 
    // any char in this sring will be used to split the input 
    const char *delims = " "; 

    // get some memory - same length as original string. 
    // **this will be too much** we dont need memory for the sapces 
    // that will be removed. 
    int len = strlen(input); 
    char *result = (char*)calloc(len, 1); 

    // return a string that contains chars up to the first 
    // char found in the delims string 
    char *curWord = strtok(tmp,delims); 
    while (curWord != NULL) 
    { 
     // make the whole word lower-case 
     //strlwr(curWord); 
     str2lower(curWord); 

     // capitalize the first letter 
     curWord[0] = toupper(curWord[0]); 
     // tack it onto the end of our result 
     strcat(result, curWord); 
     // get the next word 
     curWord = strtok(NULL, delims); 
    } 
    // dont need this anymore 
    free(tmp); 
    return result; 
} 

int main() 
{ 
    // http://www.ee.ryerson.ca/~elf/hack/realmen.html 
    char *result = pascalCase("real programmers don't use pascal"); 
    printf("%s\n", result); 
    free(result); 
} 
+1

[strlwr()関数は、Cの標準ライブラリでは使用できない非標準関数です。(http://fresh2refresh.com/c-programming/c-strings/c-strlwr-function/) – cdlane

+0

@cdlane - いい視点ね。私は実装を追加します。 – enhzflep

0

すべての仕様に対処し、それをシンプルに保つための試み:

#include <string.h> 
#include <ctype.h> 

/* Convert to Pascal case */ 
/* It is safe to assume that the string is terminated by '\0' */ 

void PascalCase(char *string) { // "cat dog" -> "CatDog" 

    char *pointer = string; 

    while (*pointer != '\0') { 
     if (pointer == string) { // first character in string 
      *pointer = toupper(*pointer); 
     } else { 
      *pointer = tolower(*pointer); // character not beginning a word 
     } 

     while (*pointer == ' ') { 
      (void) memmove(pointer, pointer + 1, strlen(pointer)); // remove space from string 
      if ((*pointer = toupper(*pointer)) == '\0') { // capitalize if a letter replaces space 
       return; // not documented if memmove() leaves original '\0' so CYA 
      } 
     } 

     ++pointer; 
    } 
} 

それはまた'\0'後に落ちるように、文字列の最初の文字のためのテストをループ内で移動されました関数が空の文字列を渡すべきかどうかをテストします。

0

2番目のバッファを使用する方が簡単ですが、ここでもう1つの方法があります。 バッファへのポインタが2つあり、その文字列をトラバースします。 isspaceは、文字が空白であるかどうかを確認するための標準ランタイム関数です。

​​
関連する問題