2

私はこのプログラムを書いて、C をもう少しよく理解しようとしました。動作しますが、何らかの理由で (null) が正しい出力の前に出力されます。私のコード:

/* This program will take a string input input from the keyboard, convert the
string into all lowercase characters, then print the result.*/

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

int main()
{
    int i = 0;
    /* A nice long string */
    char str[1024];                               
    char c;
    printf("Please enter a string you wish to convert to all lowercase: ");

    /* notice stdin being passed in for keyboard input*/
    fgets(str, 1024, stdin);  //beware: fgets will add a '\n' character if there is room       

    printf("\nYour entered string: \n\n%s\n", str);
    printf("\nString converted to lowercase: \n\n%s\n");
    while(str[i]) { //iterate str and print converted char to screen
        c = str[i];
        putchar(tolower(c));
        i++;
    }
    putchar('\n'); //empty line to look clean
    return 0;
}

ちなみに、文字列変数を最後の printf 関数に追加すると、問題が解決することに気付きました。

交換:

printf("\nString converted to lowercase: \n\n%s\n"); 

printf("\nString converted to lowercase: \n\n%s\n, str");

この問題を示す出力例を次に示します。

Please enter a string you wish to convert to all lowercase: THE QUICK BROWN FOX
JUMPED OVER THE LAZY DOG.

Your entered string:

THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.


String converted to lowercase:

(null)
the quick brown fox jumped over the lazy dog.

Press any key to continue . . .
4

1 に答える 1

6

この印刷ステートメント:

printf("\nString converted to lowercase: \n\n%s\n");

フォーマット文字列にa%sがありますが、それに一致する引数が渡されていません。

0aがたまたま渡され、printf実装が print によってそれを適切に処理することは幸運です(null)。ここでは、未定義の動作領域にいます。

さらにいくつかの警告フラグをオンにすると、コンパイラはこの種の問題について警告する可能性があります。ここでの簡単なテストでは、Clang はフラグさえ必要としませんでした。

$ clang example.c -o example
example.c:20:51: warning: more '%' conversions than data arguments [-Wformat]
    printf("\nString converted to lowercase: \n\n%s\n");
                                                 ~^
1 warning generated.

GCCもそうではありませんでした:

$ gcc example.c -o example
example.c: In function ‘main’:
example.c:20: warning: too few arguments for format
example.c:20: warning: too few arguments for format
于 2013-06-05T05:54:17.243 に答える