警告 C6067

'function' の呼び出しのパラメーター 'number' は、文字列のアドレスである必要があります

解説

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

この障害は、何らかの形式のクラッシュまたは破損の原因となる可能性があります。

コード分析名: NON_STRING_ARGUMENT_TO_FORMAT_FUNCTION

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

#include <stdio.h>

void f_defective()
{
  char *str = "Hello, World!";
  printf("String:\n %s", 1);
  // code ...
}

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

#include <stdio.h>

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

次のコードでは、バッファー パラメーターを 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);
}

関連項目

書式指定構文: printf 関数と wprintf 関数
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
C4313
C4477