2

私はCとプログラミングが初めてです。宿題の練習で行き詰まりました。私の出力は、大文字の最初の文字と、いくつかの奇妙な数字の次の文字のみを示しています。誰かが私のコードを見て、私が間違ったことと問題を解決する方法についてのヒントを教えてもらえますか? あなたの助けは大歓迎です!

「関数 void sticky(char* word) を記述します。ここで、word は「sticky」や「RANDOM」などの単一の単語です。sticky() は、「sticky caps」で表示されるように単語を変更する必要があります ( http://en.wikipedia. org/wiki/StudlyCaps )、つまり、最初の文字を大文字にして、大文字と小文字を交互に使用する必要があります。たとえば、「sticky」は「StIcKy」になり、「RANDOM」は「RaNdOm」になります。 . '\0' で示される文字列の末尾に注意してください。sticky() 関数に有効な文字列が渡されたと想定できます。"

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

/*converts ch to upper case, assuming it is in lower case currently*/
char toUpperCase(char ch)
{
 return ch-'a'+'A';
}

/*converts ch to lower case, assuming it is in upper case currently*/
char toLowerCase(char ch)
{
 return ch-'A'+'a';
}

void sticky(char* word){
 /*Convert to sticky caps*/

for (int i = 0; i < sizeof(word); i++)
{
    if (i % 2 == 0)
    {
        word[i] = toUpperCase(word[i]);
    }
    else
    {
        word[i] = toLowerCase(word[i]);
    }
}

}

int main(){
/*Read word from the keyboard using scanf*/
char word[256];
char *input;
input = word;
printf("Please enter a word:\n");
scanf("%s", input);

/*Call sticky*/
sticky(input);

/*Print the new word*/
printf("%s", input);

for (int i = 0; i < sizeof(input); i++)
{
    if (input[i] == '\n')
    {
        input[i] = '\0';
        break;
    }
}

return 0;

}

4

7 に答える 7

5

char* 文字列の長さを見つけstrlenないように使用する必要がありますsizeof

于 2013-03-26T22:27:59.523 に答える
3

関数change upperを変更するchange lower

/*converts ch to upper case,*/
char toUpperCase(char ch)
{
    if(ch>='a' && ch<='z')/*If condition just to make sure current letter is in  lower case*/
        return ch-'a'+'A';
}

/*converts ch to lower case, assuming it is in upper case currently*/
char toLowerCase(char ch)
{
    if(ch>='A' && ch<='Z')/*If condition just to make sure current letter is in  Upper case*/
        return ch-'A'+'a';
}

また、文字列の長さを見つけるためfour charactersに使用しているため、のみが変換されます。常に 4 を返します (マシンによって異なります)。 次のforループで文字列単語の長さを見つける:sizeofsizeofuse strlen(word)

for (int i = 0; i < strlen(word); i++)
{
}
于 2013-03-26T22:31:10.887 に答える
2

strlenの代わりに使用する必要がありsizeofます。また、文字がすでに大文字か小文字かを確認する必要があります。

for (int i = 0; i < strlen(word); i++)
{
    if (i % 2 == 0)
    {
        if ( isLowerCase(word[i]) )
        {
            word[i] = toUpperCase(word[i]);
        }
        else
        {
            // do nothing.
        }
    }
    else
    {
        if ( isUpperCase(word[i]) )
        {
            word[i] = toLowerCase(word[i]);
        }
        else
        {
            // do nothing.
        }
    }
}

isUpperCase関数と関数を実装していないことに注意してくださいisLowerCase;D

于 2013-03-26T22:28:29.783 に答える
0

関数sizeof()は、ポインターに割り当てられたサイズではなく、データ型のサイズを計算するために使用されます。

したがって、 のように使用することはできませんsizeof(word)\0代わりに、文字列の終わりを示す に出くわすまで、文字を反復処理します。

例:

int i = 0;
while ( word[i] != 0 ) {
  // do lower/upper case conversion.
}
于 2013-03-26T22:27:28.133 に答える
0

sizeof (word)は char * のサイズです。配列のサイズを指定して別のパラメーターを渡す必要があります... または strlen () を使用します。

于 2013-03-26T22:27:54.293 に答える
0

コードに何か問題があります。奇数文字を大文字に、偶数文字を小文字にしていますが、そもそもそれらが小文字か大文字かをチェックしていません。しかし、既に小文字になっている文字を下げると、間違った値が返されます (同じことが、既に大文字になっている文字を「大文字にする」場合にも当てはまります)。

したがって、次のことを行う必要があります。

char toUpperCase(char ch)
{
 if ((ch >= 'a') && (ch <= 'z')) {
   return ch-'a'+'A';
 } else {
   return ch;
 }
}

についても同じですtoLowerCase

于 2013-03-26T22:29:38.437 に答える
0

ヒントをありがとうございました!あなたの提案を使用して、コードを変更しましたが、現在は機能しています。

以下は私の修正されたコードです:

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

/*converts ch to upper case, assuming it is in lower case currently*/
char toUpperCase(char ch){
    return ch-'a'+'A';
}

/*converts ch to lower case, assuming it is in upper case currently*/
char toLowerCase(char ch){
    return ch-'A'+'a';
}



void sticky(char* word)
{
 /*Convert to sticky caps*/

for (int i = 0; i < strlen(word); i++)
{
    if (i % 2 == 0)
    {
        if (word[i] >= 'a' && word[i] <= 'z')
        {
            word[i] = toUpperCase(word[i]);
        }

    }
    else
    {
        if (word[i] >= 'A' && word[i] <= 'Z')
        {
            word[i] = toLowerCase(word[i]);
        }

    }
}

}

int main(){
/*Read word from the keyboard using scanf*/
char word[256];
char *input;
input = word;
printf("Please enter a word:\n");
scanf("%s", input);

/*Call sticky*/
sticky(input);

/*Print the new word*/
printf("%s", input);

for (int i = 0; i < sizeof(input); i++)
{
    if (input[i] == '\n')
    {
        input[i] = '\0';
        break;
    }
}

return 0;

}

于 2013-03-27T00:06:41.360 に答える