字符串读/写期间出错

时间:2016-09-13 00:31:05

标签: c

以下程序用于将字符串写入文件 当我使用gcc编译时,它显示错误

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

int main() {
    FILE *fp;
    char s[80];
    fp = fopen("POEM.TXT", "w");
    if(fp == NULL) {
        puts("Cannaot open file");
        exit(1);
    }
    printf("\n Enter");
    while(strlen(gets(s)) > 0) {
        fputs(s, fp);
        fputs("\n", fp);
    }
    fclose(fp);
    return 0;
}

编译时的错误是

gcc expi.c
expi.c: In function ‘main’:
expi.c:18:14: warning: implicit declaration of function ‘gets’ [-Wimplicit-function-declaration]
 while(strlen(gets(s))>0)
              ^
expi.c:18:14: warning: passing argument 1 of ‘strlen’ makes pointer from integer without a cast [-Wint-conversion]
In file included from expi.c:2:0:
/usr/include/string.h:394:15: note: expected ‘const char *’ but argument is of type ‘int’
 extern size_t strlen (const char *__s)
               ^
/tmp/ccHMKvW7.o: In function `main':
expi.c:(.text+0x87): warning: the `gets' function is dangerous and should not be used.

代码没有编译它是教科书代码,我无法运行它。它会创建一个文件,但它不会向其添加运行时文本

1 个答案:

答案 0 :(得分:-1)

首先,请勿使用gets()。这是一个非常危险的函数,因为阵列溢出的风险很大,而且它已从最近的标准中删除。

此外,您应该了解strlen()的工作原理以及的表示方式。你可以和

完全一样
while (strlen(string) > 0)

只写

while (string[0] != '\0')

但为此您需要了解是什么。在这两种情况下,您应检查string是否不是NULL指针。

也许这就是你想要的

while (fgets(s, sizeof(s), stdin) != NULL) ...

不是fgets()基本上是以gets()的功能实现的,它可以安全地避免缓冲区溢出。