-4

ポインターを使用して小文字を大文字に変換したい。以下のコードは機能せず、エラーが発生します。

#include<stdio.h>

int main()
{
    char somearray[10]; char mask;
    mask = 1 << 5;
    mask = ~mask;
    char *someptr;
    gets(somearray);
    puts(somearray);
    someptr =&somearray[0];

    while (*someptr != '\n')
    {
        *someptr = *someptr & mask ;

        someptr++;
    }
    printf("%s",someptr);
    return 0;
} 

エラーが発生しました:

not able to compile , if compiled runtime error

以下のコードでも機能しません。

#include <stdio.h>

int main()
{
    char somearray[10];
    char mask;
    char *someptr;

    mask = 1 << 5;
    mask = ~mask;

    fgets( somearray, sizeof(somearray), stdin ); /* gets() is suspect: see other reactions */
    puts(somearray);
    for ( someptr = somearray; *someptr != '\0';someptr++)
    {
        *someptr &= mask ;
    }

    printf("%s",someptr);



    return 0;
}

入力: abcd 出力: abcd.、予想: ABCD

4

3 に答える 3

3

gets()改行文字を配列に格納しないため、ループは配列の終わりを超えて、想定外のメモリにアクセスして変更します。scanf()バッファオーバーランを防ぐために、読み取る文字数を使用および制限します(実際にC ++を使用std::getline()している場合std::string):

scanf("%9s", somearray);

そして、最初のヌル文字でループを終了します。

while (*someptr != '\0')

ループの終わりを指し、空の文字列を出力するように、ループsomearrayprintf()後に渡す必要があります。someptrsomearray


読む価値があります:警告:gets関数は危険です

于 2012-07-12T21:51:27.197 に答える
0

いくつかのポインタ:

代わりにfgetsを使用してkeybaordから読み取ります。これにより、バッファを超えない文字列の最大サイズを指定できます。

例えばfgets( somearray, sizeof(somearray), stdin );

代わりに標準関数tolower(int c)を使用してください

例えば*someptr = tolower(*someptr);

whileループでは、文字列の終わりもチェックします。つまりwhile (someptr && someptr!='\n') 、ループがfgetsとscanfから返された両方の文字列を処理するようにします。

于 2012-07-12T22:13:51.767 に答える
-1

コードを少しクリーンアップしましたが、それでもその意図がわかりません。

#include <stdio.h>

int main()
{
    char somearray[10]; 
    char mask;
    char *someptr;

    mask = 1 << 5;
    mask = ~mask;

    gets(somearray); /* gets() is suspect: see other reactions */
    puts(somearray);
    for ( someptr = somearray; *someptr != '\n';someptr++) 
    {
        *someptr &= mask ;
    }

    printf("%s",someptr); /* must point to '\n', otherwise we would 
                          ** not get here BTW: gets() removes the \n 
                          ** and replaces it by a \0 so we wont get here
                          */
    return 0;
}

ところで:人間の読者にあなたの意図を示したい場合:リテラルで十分な場合は変数を使用しないでください:

*someptr &= ~(0x20);

しかし、さらに良い:

 *someptr = toupper (*someptr);
于 2012-07-12T22:23:51.597 に答える