此示例导致c4028警告,原因是什么?
我有没有申报错误?当我调试一次v-s 2017时,显示以下内容: (8) :警告C4028:形式参数1与声明不同 (8) :警告C4028:形式参数2与声明不同 如果我再次调试而不干预代码,警告就会消失,但如果我添加一个空格,警告行就会再次出现此示例导致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
#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)