C使用fscanf和printf返回奇怪的值?

时间:2014-09-24 14:49:35

标签: c file printf

我在学校学习C,我在学习如何阅读文件时遇到了问题。

这个问题不是家庭作业,而是我正在编写的一本书中的练习练习。

我的文件是一个名为Letters.txt的.txt文件。

它包含这些内容中的所有数据:'#Alphabet.123.45ABCDEFGHIJKLMNOPQRSTUVWXYZ'。

有'>'符号,然后是字母,然后是(。)然后是123,然后是(。)然后是45,然后是'ABCDEFGHIJKLMNOPQRSTUVWXYZ'。

我遇到的第一个问题是,当我尝试读取文件并将其打印到屏幕上以查看我是否正确阅读时,我的控制台只打印出MZÉ。我不知道那是什么。

我的代码是:

   FILE *fp;
   char *fname;

   fname = "Letters.txt";

   fp = fopen(fname, "r");

   char *buff[100];

   fscanf(fp, "%s", buff);
   printf("%s", buff); 

   fclose(fp);

其次,实际的练习应该是将这个输入分成单独的变量:

丢弃初始字符,带有Alphabet.123.45的字符串和带有'ABCDEFGHIJKLMNOPQRSTUVWXYZ'的字符串。

我一直在网上找到REGEX教程,但我并不熟悉那些。作为参考,我以前只精通Java,Javascript,PHP,MySQL和JQuery。

4 个答案:

答案 0 :(得分:1)

我在这里看到了几个问题。

  • 你应该把buff归零。内存中的随机字节不等于0可能会导致printf上的数据被覆盖。加上c字符串以零(null)结束。
  • 其次,您应该检查fscanf返回的值。如果是负数,则表示您有错误。如果是正数,则表示读入的字符数。如果该数字大于100,则表示您已覆盖缓冲区(错误)。
  • 第三,正如Cool Guy指出的那样,你应该删除*之前的buff,因为你想要一个字符串数组,而不是指向一个字符串数组的指针。

通常,在c中处理库函数时,应检查负数的所有返回值。如果您收到负数,则应致电get_errno()以查看问题所在。例如,在打开文件时,可能由于不同原因而无法打开,并且您的程序可能希望根据open()调用失败的原因执行不同的操作。

答案 1 :(得分:0)

buff之前删除星号,然后它应该可以正常工作!此外,您必须检查if(fp!=NULL)以查看文件是否已打开

答案 2 :(得分:0)

您需要检查fopen的返回值,以确保它已成功打开文件。如果它失败了,你将从fscanf获得垃圾回收。 fscanf也返回一个你应该检查的有用值

答案 3 :(得分:0)

#include <stdio.h>

int main(){
    FILE *fp;
    char *fname = "Letters.txt";

    fp = fopen(fname, "r");

    char buff[100];
    fscanf(fp, "%99s", buff);
    printf("%s\n", buff); 

    fclose(fp);

    char field[4][32];
    sscanf(buff, "%*c%31[A-Za-z].%31[0-9].%31[0-9]%31s", field[0], field[1], field[2],field[3]);
    printf("%s\n", field[0]);
    printf("%s\n", field[1]);
    printf("%s\n", field[2]);
    printf("%s\n", field[3]);
    return 0;
}