C6067
Ostrzeżenie C6067: parametr <number> w wywołaniu <function> musi być adresem ciągu
To ostrzeżenie wskazuje niezgodność między specyfikatorem formatu a parametrem funkcji.Mimo że ostrzeżenie sugeruje użycie adresu ciągu, należy sprawdzić typ parametru jakiego oczekuje funkcja przed naprawieniem problemu.Na przykład, specyfikacja %s dla printf wymaga ciągu jako argumentu, ale specyfikacja %s w scanf wymaga adresu ciągu.
Defekt ten może spowodować awarię lub uszkodzenie w jakiejś formie.
Przykład
Poniższy kod generuje ostrzeżenie, ponieważ przekazano liczbę całkowitą, zamiast ciągu:
#include <stdio.h>
void f_defective( )
{
char *str = "Hello, World!";
printf("String:\n %s",1); // warning
// code ...
}
Aby poprawić ostrzeżenie, jako parametr do printf przekaż ciąg, tak jak pokazano w poniższym kodzie:
#include <stdio.h>
void f_corrected( )
{
char *str = "Hello, World!";
printf("String:\n %s",str);
// code ...
}
Poniższy kod generuje to ostrzeżenie, ponieważ określono niepoprawny poziom pośrednictwa, podczas przekazywania parametrów, buforu do 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 ;
}
}
Aby poprawić powyższe ostrzeżenia, należy przekazać prawidłowy parametr, jak pokazano w poniższym kodzie:
#include <stdio.h>
void h_corrected( )
{
int retval;
char* buffer = new char(20);
if ( buffer )
{
retval = scanf("%s", buffer);
// code...
delete buffer;
}
}
Następujący kod używa bezpiecznych funkcji manipulacji ciągami, aby poprawić to ostrzeżenie:
#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);
}
Zobacz też
Informacje
sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l