此示例导致c4028警告,原因是什么?

此示例导致c4028警告,原因是什么?,c,function,pointers,visual-studio-2017,C,Function,Pointers,Visual Studio 2017,我有没有申报错误?当我调试一次v-s 2017时,显示以下内容: (8) :警告C4028:形式参数1与声明不同 (8) :警告C4028:形式参数2与声明不同 如果我再次调试而不干预代码,警告就会消失,但如果我添加一个空格,警告行就会再次出现 #include <stdio.h> #include <ctype.h> #include <string.h> char* mygets(char* s, const size_t size); //ok ch

我有没有申报错误?当我调试一次v-s 2017时,显示以下内容:

(8) :警告C4028:形式参数1与声明不同

(8) :警告C4028:形式参数2与声明不同

如果我再次调试而不干预代码,警告就会消失,但如果我添加一个空格,警告行就会再次出现

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


char* mygets(char* s, const size_t size); //ok
char *strstr(char *str1, char *str2); //warning appear here at the function prototype  

//this function below are ok
char* mygets(char* s, const size_t size) {
    if (!s) return s; 
    size_t count = size;
    char* sp = s;
    int ch;

    for (; (count > 0) && ((ch = getchar()) != EOF); ) {
        --count; 
        if ((*sp++ = ch) == '\n') break; 
    }
    *sp = '\0'; 
    return s;
}

//function body of the warning
char *strstr(char *str1, char *str2) {
    char *ptr = NULL;
    int count = 0;
    for (int i = 0; str1[i] != '\0'; i++)
    {
        if (str1[i] == str2[0])
        {
            for (int j = 0; str2[j] != '\0'; j++)
            {
                if (str1[i + j] != '\0' && str1[i + j] != str2[j])
                {
                    break;
                }
            }
            if (strlen(str2) == count)
            {
                ptr = str1 + i;
                return ptr;
            }
        }
    }
    return NULL;
}
main() {

    char s[100];
    char s2[100];

    printf("word\n");
    mygets(s, 99);
    printf("sub-word\n");
    mygets(s, 99);

    printf("%s\n", strstr(s, s2));
}
#包括
#包括
#包括
char*myget(char*s,const size\u t size)//好啊
char*strstr(char*str1,char*str2)//警告出现在函数原型的此处
//下面的功能正常
char*myget(char*s,const size\u t size){
如果(!s)返回s;
大小\u t计数=大小;
char*sp=s;
int-ch;
对于(;(计数>0)&((ch=getchar())!=EOF);){
--计数;
如果(*sp++=ch)='\n')中断;
}
*sp='\0';
返回s;
}
//警告的功能主体
char*strstr(char*str1,char*str2){
char*ptr=NULL;
整数计数=0;
对于(int i=0;str1[i]!='\0';i++)
{
if(str1[i]==str2[0])
{
对于(int j=0;str2[j]!='\0';j++)
{
if(str1[i+j]!='\0'和&str1[i+j]!=str2[j])
{
打破
}
}
如果(strlen(str2)=计数)
{
ptr=str1+i;
返回ptr;
}
}
}
返回NULL;
}
main(){
chars[100];
字符s2[100];
printf(“word\n”);
mygets(s,99);
printf(“子单词\n”);
mygets(s,99);
printf(“%s\n”,strstrstr(s,s2));
}
strstr()是一个标准函数。它的模板是

char* strstr(const char*, const char*);

因此,这可能就是您得到的错误。将函数名更改为strstr1并尝试使用它,因为您已经包含了
string.h

char *strstr(char *str1, char *str2);
仔细查看警告和源代码行,它告诉您需要知道的一切:

warning C4028: formal parameter 1 different from declaration
warning C4028: formal parameter 2 different from declaration
它试图告诉您参数1和2,即
char*
char*
的类型与声明中预期的类型不同。因为,声明是从您上面包含的标准
string.h
头文件中引用的

现在,查看的手册页,您将发现:

char *strstr(const char *haystack, const char *needle);
要消除警告,您应该将函数更改为任何其他名称,或者删除字符串.h include。我建议您更改函数名,因为您的代码似乎使用了其他函数,如
strlen
,这取决于标题

关于这一点:

如果我再次调试而不干预代码,警告就会消失,但如果我添加一个空格,警告行就会再次出现

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


char* mygets(char* s, const size_t size); //ok
char *strstr(char *str1, char *str2); //warning appear here at the function prototype  

//this function below are ok
char* mygets(char* s, const size_t size) {
    if (!s) return s; 
    size_t count = size;
    char* sp = s;
    int ch;

    for (; (count > 0) && ((ch = getchar()) != EOF); ) {
        --count; 
        if ((*sp++ = ch) == '\n') break; 
    }
    *sp = '\0'; 
    return s;
}

//function body of the warning
char *strstr(char *str1, char *str2) {
    char *ptr = NULL;
    int count = 0;
    for (int i = 0; str1[i] != '\0'; i++)
    {
        if (str1[i] == str2[0])
        {
            for (int j = 0; str2[j] != '\0'; j++)
            {
                if (str1[i + j] != '\0' && str1[i + j] != str2[j])
                {
                    break;
                }
            }
            if (strlen(str2) == count)
            {
                ptr = str1 + i;
                return ptr;
            }
        }
    }
    return NULL;
}
main() {

    char s[100];
    char s2[100];

    printf("word\n");
    mygets(s, 99);
    printf("sub-word\n");
    mygets(s, 99);

    printf("%s\n", strstr(s, s2));
}
有一些(愚蠢的)IDE,控制台在其中显示警告,如果您只是构建(而不是重新构建!)代码而不做任何更改,警告就会消失。然后,只有更改源/头文件中触发警告的内容时,才会出现警告。例如,keil MDK就是这样做的


此外,代码中还有多项改进,例如:

  • main
    可以有标准的返回类型,最好是
    int main(void)
  • 循环中有一个
    if(strlen(str2)==count)
    ,应该避免,它是每次迭代的函数调用,对吗?您可以始终获取一个变量,在循环之前捕获一次字符串长度

你知道吗?这是一种非常糟糕的做法,将问题修改得如此彻底,以至于以前有效的答案之一变得完全不适用。那太差劲了!是的,它是与std函数相同的函数名。您是否更改了名称?它编译了吗?是的,第一次尝试,认为没有,但现在编译了