从不兼容的指针类型传递‘fgets’的参数 3 [默认启用]
Passing argument 3 of ‘fgets’ from incompatible pointer type [enabled by default]
我是 C 语言编程的完全新手,一直在尝试编写一个系统,该系统将采用整数输入、执行计算并将它们附加到一个字符串上,然后将其传递到共享内存。抱歉,如果我是个白痴,但我收到有关不兼容指针类型的错误。我不知道如何修复此错误。
编辑:对于糟糕的初始问题,我深表歉意。包含完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
/* The size (in bytes) of shared-memory object */
const int SIZE = 4096;
/* The name of shared-memory object */
const char *Obj = "Shm";
/* The shared-memory file descriptor */
int shm_fd;
/* The pointer to shared-memory object */
void *ptr;
/* Create the shared-memory object */
shm_fd = shm_open(Obj, O_CREAT | O_RDWR, 0666);
/* Configure the size of the shared-memory object */
ftruncate(shm_fd, SIZE);
/* Map the shared-memory object in the address space of the process */
ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (ptr == MAP_FAILED)
{
printf("Map failed\n");
return -1;
}
int cal;
char newStr[200];
char currentStr[200];
char *temp;
char value;
printf("Enter an integer");
scanf("%d", &cal);
/* Create a message and write it to the shared-memory object */
/*fgets(ptr, SIZE, stdin);*/
if (cal == 0) {
printf("0 is not valid");
return -1;
}
if (cal < 1) {
printf("Please enter a positive int");
return -1;
}
sprintf(newStr, "%d", cal);
while (cal != 1) {
if (cal % 2 == 0) {
cal = cal / 2;
}
else {
cal = 3 * cal + 1;
}
value = cal + '0';
sprintf(currentStr, " --- %d", value);
strcat(newStr, currentStr);
}
fgets(ptr, SIZE, newStr);
printf("Writing the message to the shared memory is done! \n");
return 0;
}
由于我的编码环境的性质,测试和找出错误的确切性质特别困难。
编辑:这是确切的错误消息
Collatz-Producer.c:84:2: warning: passing argument 3 of ‘fgets’ from incompatible pointer type [enabled by default]
我用 ptr
删除了上面的部分,因为我相信它有效,尽管这里是 ptr
等于
的具体内容
void *ptr;
ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
根据this documentation,函数fgets
接受3个参数,顺序为:
- 指向要写入的内存缓冲区的指针
- 内存缓冲区的大小
- 要从中读取的
FILE *
流,例如 stdin
数组 newStr
不是 FILE *
流。因此,它作为第三个参数是无效的。
如果您不打算从 FILE *
流(例如 stdin
或使用 fopen
打开的文件)读取,那么您不应该使用函数 fgets
.
我是 C 语言编程的完全新手,一直在尝试编写一个系统,该系统将采用整数输入、执行计算并将它们附加到一个字符串上,然后将其传递到共享内存。抱歉,如果我是个白痴,但我收到有关不兼容指针类型的错误。我不知道如何修复此错误。 编辑:对于糟糕的初始问题,我深表歉意。包含完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
/* The size (in bytes) of shared-memory object */
const int SIZE = 4096;
/* The name of shared-memory object */
const char *Obj = "Shm";
/* The shared-memory file descriptor */
int shm_fd;
/* The pointer to shared-memory object */
void *ptr;
/* Create the shared-memory object */
shm_fd = shm_open(Obj, O_CREAT | O_RDWR, 0666);
/* Configure the size of the shared-memory object */
ftruncate(shm_fd, SIZE);
/* Map the shared-memory object in the address space of the process */
ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
if (ptr == MAP_FAILED)
{
printf("Map failed\n");
return -1;
}
int cal;
char newStr[200];
char currentStr[200];
char *temp;
char value;
printf("Enter an integer");
scanf("%d", &cal);
/* Create a message and write it to the shared-memory object */
/*fgets(ptr, SIZE, stdin);*/
if (cal == 0) {
printf("0 is not valid");
return -1;
}
if (cal < 1) {
printf("Please enter a positive int");
return -1;
}
sprintf(newStr, "%d", cal);
while (cal != 1) {
if (cal % 2 == 0) {
cal = cal / 2;
}
else {
cal = 3 * cal + 1;
}
value = cal + '0';
sprintf(currentStr, " --- %d", value);
strcat(newStr, currentStr);
}
fgets(ptr, SIZE, newStr);
printf("Writing the message to the shared memory is done! \n");
return 0;
}
由于我的编码环境的性质,测试和找出错误的确切性质特别困难。
编辑:这是确切的错误消息
Collatz-Producer.c:84:2: warning: passing argument 3 of ‘fgets’ from incompatible pointer type [enabled by default]
我用 ptr
删除了上面的部分,因为我相信它有效,尽管这里是 ptr
等于
void *ptr;
ptr = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0);
根据this documentation,函数fgets
接受3个参数,顺序为:
- 指向要写入的内存缓冲区的指针
- 内存缓冲区的大小
- 要从中读取的
FILE *
流,例如stdin
数组 newStr
不是 FILE *
流。因此,它作为第三个参数是无效的。
如果您不打算从 FILE *
流(例如 stdin
或使用 fopen
打开的文件)读取,那么您不应该使用函数 fgets
.