C2100错误:非法间接寻址

C2100错误:非法间接寻址,c,pointers,function-parameter,C,Pointers,Function Parameter,我不理解这个错误(C2100:非法间接寻址)。我在底部附近标记了三个实例。我在网上看过了,我知道这和我的指针有关,但在这8个小时之后,我完全迷路了。这里可能还有其他一些错误,但我甚至不能说,因为我无法编译它。请帮忙&我希望能有一个我能理解的解释,这样我就可以找出我在未来做错了什么 // INCLUDE FILES #include <stdio.h> #include <string.h> // PROGRAM CONSTANTS #define MAX_MSG

我不理解这个错误(C2100:非法间接寻址)。我在底部附近标记了三个实例。我在网上看过了,我知道这和我的指针有关,但在这8个小时之后,我完全迷路了。这里可能还有其他一些错误,但我甚至不能说,因为我无法编译它。请帮忙&我希望能有一个我能理解的解释,这样我就可以找出我在未来做错了什么

// INCLUDE FILES
#include <stdio.h>
#include <string.h>

// PROGRAM CONSTANTS
#define     MAX_MSG_LEN     81      // Maximum Message Length (Including /0 Character)

// FUNCTION PROTOTYPES
void printLength(int, int);         // Function to Validate & Print Length of String
void printString(int, char);        // Function to Print the String in Reverse
void writeToFile(int, char);

// GLOBAL VARIABLES
char input[MAX_MSG_LEN];            // Input String
int maxLength = MAX_MSG_LEN - 1;    // Actual String Length (Not Including /0 Character)
char *ptr = input;                  // Character Pointer to String
int length = 0;                     // Length of Current String
int lcv = 0;                        // Loop Control Variable


void main()
{
    FILE *ifp;
    ifp = fopen("reverseString.txt", "w");

    printf("\n\nEnter a String Between 1 and %d Characters: ", maxLength);  // Prompts User to Enter a String Less Than 80
    gets(input);        // Receives the Inputted String from the User   

    length = strlen(input);     // Counts the Length of the Inputted String & Assigns the Number to the "length" Variable

    printLength(length, maxLength);
    printString(length, *ptr);
    writeToFile(length, *ptr);
}

void printLength(int length, int maxLength)
{
    if(length > maxLength)
    {
        printf("\n\nThe Maximum Length of %d Characters was Exceeded!", maxLength);
        printf("\nProgram Terminated...\n\n");
        exit(0);
    }

    printf("\n\nThe Length of the Input String was: %d\n", length);     // Prints the Length of the Inputted String
}

void printString(int length, char ptr)
{   
    for(; lcv < length; lcv++)
    {
        ptr++;
    }

    length = lcv;
    printf("\nThe String in Reverse: ");

    for(ptr--; length > 0; length--)
    {
        printf("%c", *ptr);     // HERE IS ONE INSTANCE OF C2100
        *ptr--;                 // HERE IS ONE INSTANCE OF C2100
    }

    printf("\n\n");
    return;
}

void writeToFile(int length, char ptr)
{
    FILE *ifp;
    ifp = fopen("reverseString.txt", "w");
    fprintf(ifp, "%c", *ptr);   // HERE IS ONE INSTANCE OF C2100
    fclose(ifp);
}
//包含文件
#包括
#包括
//程序常数
#定义最大消息长度81//最大消息长度(包括/0个字符)
//功能原型
无效打印长度(int,int);//用于验证和打印字符串长度的函数
无效打印字符串(int,char);//函数以反向打印字符串
无效写入文件(int,char);
//全局变量
字符输入[MAX_MSG_LEN];//输入字符串
int maxLength=MAX\u MSG\u LEN-1;//实际字符串长度(不包括/0字符)
char*ptr=input;//字符串的字符指针
int length=0;//当前字符串的长度
int lcv=0;//回路控制变量
void main()
{
文件*ifp;
ifp=fopen(“reverseString.txt”,“w”);
printf(“\n\n输入一个介于1和%d个字符之间的字符串:”,maxLength);//提示用户输入一个小于80的字符串
获取(输入);//从用户处接收输入的字符串
length=strlen(输入);//计算输入字符串的长度并将数字指定给“length”变量
打印长度(长度,最大长度);
打印字符串(长度,*ptr);
写入文件(长度,*ptr);
}
无效打印长度(int-length,int-maxLength)
{
如果(长度>最大长度)
{
printf(“\n\n超过了%d个字符的最大长度!”,maxLength);
printf(“\n程序终止…\n\n”);
出口(0);
}
printf(“\n\n输入字符串的长度为:%d\n”,Length);//打印输入字符串的长度
}
无效打印字符串(整数长度,字符ptr)
{   
对于(;lcv0;长度--)
{
printf(“%c”,*ptr);//这里是C2100的一个实例
*ptr--;//这里是C2100的一个实例
}
printf(“\n\n”);
返回;
}
void writeToFile(int-length,char-ptr)
{
文件*ifp;
ifp=fopen(“reverseString.txt”,“w”);
fprintf(ifp,'%c',*ptr);//这里是C2100的一个实例
fclose(ifp);
}

在代码中,语法错误。您需要更改声明和定义

就这样说吧

 printString(length, ptr);
writeToFile()函数也是如此

否则,对于当前代码,在
printString()
writeToFile()
函数中,定义为
char ptr
ptr
不是可以取消引用的指针类型

也就是说

  • 切勿使用
    gets()
    ,它会遇到缓冲区溢出问题,请改用

  • 在使用返回的指针之前,请始终检查
    fopen()
    中的返回值,以确保调用成功

  • 为符合标准,
    void main()
    至少应为
    int main(void)


我尝试在DevC++IDE上编译您的代码,发现您的代码有3个问题。我将列举如下

1) 按照Saurav Ghosh的建议,尝试更改函数
printString()
writeToFile()
的声明

2) 包含
stdlib.h
头以支持
exit()
功能,因为
exit()
的定义在
stdlib.h

3) 将
void main(){/*您的代码*/}
更改为
int main(){/*您的代码*/}


我做了上述更改,并在我的机器上成功编译了它

当您修复
printString
中的错误时,请注意,您实际上并不需要第一个循环,只需执行
ptr+=length
。您也不需要为
length
赋值,因此您不需要全局变量
lcv
(这很好,应该避免全局变量)。您从main发送ptr的内容,基本上是字符串(
char*ptr
)。函数将其作为单个字符(
char ptr
)接受,然后逻辑尝试在变量ptr(
*ptr
)中获取字符的内容。难怪它失败了。现在效果很好!谢谢你的解释,我真的迷路了@musikluver2003欢迎:)
void main()
在许多情况下是标准允许的,就标准而言,main的格式没有太多限制。看见例如,Visual Studio允许
void main()
作为impl。定义了行为,这很好,因为他们已经记录了它。请注意,决定main格式的是编译器,而不是程序员。@Lundin谢谢,先生,我已经知道那篇文章了。就在大多数情况下,托管环境,
intmain(void)
似乎是合适的,以防我们不打算使用命令行参数
void main()
也是可以接受的,但是
int main(void)
是首选。如果我错了,请纠正我。thanks@SouravGhosh没有偏好。C99和C11只是说“或者以某种实现定义的方式”。当然,如果您编写的程序依赖于main的实现定义形式,那么该程序将不可移植。至于独立式系统(OP很可能是这样的),
void main()
非常常见,因此在实践中总是可移植的。
  void printString(int, char*);
 printString(length, ptr);