7

私はこの小さなプログラムを持っています:

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

#define SIZE 30

void inverti (char s);

int main ()
{
        char str[SIZE+1];

        gets(str);

        printf ("Your imput: ");
        puts(str);

        invert(*str);

        printf ("It works!");

        return 0;
}

void invert (char s)
{
    int i;

    for (i = 0; i < SIZE + 1; i++)
    {
        if (isupper(str[i]))
            str[i] = tolower(str[i]);

        else if (islower(str[i]))
            str[i] = toupper(str[i]);
    }

    puts(str);
}

エラーですか?str関数に渡せないのはなぜですか?

In function ‘main’:|
warning: passing argument 1 of ‘inverti’ makes integer from pointer without a cast [enabled by default]|
note: expected ‘char’ but argument is of type ‘char *’|
In function ‘invert’:|
error: ‘str’ undeclared (first use in this function)|
note: each undeclared identifier is reported only once for each function it appears in|
||=== Build finished: 3 errors, 1 warnings ===|
4

1 に答える 1

15

あなたのコードには少なくとも 3 つの問題があります。

まず、特定の質問に最も関連するのは、関数への引数を単一の文字として宣言したことです: char. C 文字列を渡すには、引数を次のように宣言します。文字char *へのポインターは、C 文字列にも使用される型です。

void invert(char *str)

また、引数を渡すときに逆参照する必要はありません。

invert(str);

また、関数プロトタイプで関数の名前を間違って入力したことにも注意してください。そこで呼び出してinvertiいます。プロトタイプの名前は、コードの後半にある関数定義の名前と一致する必要があります。

修正して名前を変更した関数プロトタイプの引数の型も変更する必要があります。

void invert(char *str);

コードにはもう 1 つの問題がありますSIZESIZEは配列の最大サイズですが、必ずしも文字列のサイズではありません: ユーザーが 5 文字しか入力しないとどうなるでしょうか? 関数strlenを確認して使用して実際の長さを取得し、ループでは文字列の実際の長さだけを反復処理する必要があります。

于 2012-07-10T17:38:58.913 に答える