次の方法で共有


C6067

警告 C6067: パラメーター <数値> (<関数> への呼び出し内) は文字列のアドレスでなければなりません。

この警告は、書式指定子と関数パラメーターの間に不一致があることを示します。 警告では文字列のアドレスを使用することが求められますが、問題を修正する前に、関数で想定されるパラメーターの型を確認する必要があります。 たとえば、printf で %s を指定した場合は文字列引数が求められますが、scanf で %s を指定した場合は文字列のアドレスが求められます。

この問題は、なんらかのクラッシュや破損の原因となる可能性があります。

使用例

次に示すコードでは、文字列ではなく整数値が渡されるため、この警告が生成されます。

#include <stdio.h>
void f_defective( )
{  
  char *str = "Hello, World!";
  printf("String:\n %s",1); // warning
  // code ...
}

警告を修正するには、次のコードに示すように、文字列をパラメーターとして printf に渡します。

#include <stdio.h>
void f_corrected( )
{  
  char *str = "Hello, World!";
  printf("String:\n %s",str); 
  // code ...
}

次に示すコードでは、buffer パラメーターを scanf に渡すときに誤った間接レベルが指定されているため、この警告が生成されます。

#include <stdio.h>
void h_defective( )
{
  int retval;
  char* buffer = new char(20);
  if (  buffer )
  {
    retval = scanf("%s", &buffer); // warning C6067
    // code...
    delete buffer ;
  }
}

この警告を解決するには、次のコードに示すように正しいパラメーターを渡します。

#include <stdio.h>
void h_corrected( )
{
  int retval;
  char* buffer = new char(20);
  if ( buffer )
  {
    retval = scanf("%s", buffer);
    // code...
    delete buffer;
  }
}

次に示す例では、この警告を修正するために安全な文字列操作関数を使用しています。

#include <stdio.h>
void f_safe( )
{
  char buff[20];
  int retVal;
  
  sprintf_s( buff, 20, "%s %s", "Hello", "World!" );
  printf_s( "String:\n   %s  %s", "Hello", "World!" );
  retVal = scanf_s("%s", buff, 20);
}

参照

参照

sprintf_s、_sprintf_s_l、swprintf_s、_swprintf_s_l

printf、_printf_l、wprintf、_wprintf_l

scanf_s、_scanf_s_l、wscanf_s、_wscanf_s_l