fscanf til EOF以逐字

时间:2015-11-28 07:58:27

标签: c scanf

您好我正在尝试通过fscanf创建一个代码来读取文件,以查找文件中的所有单独的单词并将其保存在数组中,但它无法正常工作。你能否告诉我我的代码目前有什么问题?

char data[300][45];
char words[100];
char garbage[10];

#include <stdio.h>

int main(void)
{
int i=0,j;
FILE* file=fopen("week4_data1.in","r");
while((fscanf(file,"%[a-zA-Z]s",data[i++]))!=EOF && (fscanf(file,"%[^a-zA- Z]s",garbage))!=EOF);
for(j=0;j<i;j++)
printf("%s",data[j]);
return 0;

}

我在macs终端上运行它并且编译得很好但是当我运行它时我得到总线错误:10。

哦,这是文件的内容:

什么是算法?为什么算法研究值得?算法相对于计算机中使用的其他技术的作用是什么?在本章中,我们将回答这些问题。我们还可以将算法视为解决明确指定的计算问题的工具。问题陈述一般性地指定了期望的输入/输出关系。该算法描述了用于实现该输入,输出关系的特定计算过程。例如,可能需要将一系列数字排序为非递减顺序。这个问题在实践中经常出现,并为引入许多标准设计技术和分析工具提供了肥沃的土壤。例如,给定输入序列31,41,59,26,41,58,排序算法返回序列26,31,41,41,58,59的输出。这样的输入序列称为排序的实例问题。通常,问题的实例包括满足在计算问题解决方案所需的问题语句中强加的任何约束的输入。排序是计算机科学中的基本操作,许多程序将其用作中间步骤,因此开发了大量良好的排序算法。哪种算法最适合给定的应用程序取决于以下因素:要排序的项目数量,项目已经在某种程度上排序的程度,对项目值的可能限制以及要使用的存储设备的类型:主内存,磁盘或磁带。如果对于每个输入实例,算法以正确的输出停止,则称算法是正确的。我们说正确的算法解决了给定的计算问题。在某些输入实例上,不正确的算法可能根本不会停止,或者它可能会因所需的答案而停止。与人们可能期望的相反,如果可以控制错误率,则错误算法有时可能是有用的。当我们研究寻找大质数的算法时,我们将在第31章看到这样的例子。但是,通常情况下,我们只关注正确的算法。算法可以用英语,计算机程序或甚至硬件设计来指定。唯一的要求是规范必须提供要遵循的计算过程的精确描述。

2 个答案:

答案 0 :(得分:1)

您可以按照以下方法完成工作。

  1. 打开文件。 帮助:fopen()
  2. 检查是否成功开启。 提示:返回值。
  3. 从文件中读取一行。检查是否成功。 帮助:fgets()和返回值。
  4. 开始将读取行标记化并逐个存储到数组中。 帮助:strtok()
  5. 继续,直到令牌为NULL。
  6. 继续,直到fgets()为NULL。

答案 1 :(得分:0)

格式字符串"%[a-zA-Z]s""%^[a-zA-Z]s"不正确。您不需要这些格式字符串中的s。使用"%[a-zA-Z]""%^[a-zA-Z]"

我有一种能够解决问题的感觉。

为了使您的代码更健壮,您应该指定格式字符串中的最大字符数,并确保i不超过有效限制。

while( i < 300 &&
       fscanf(file,"%44[a-zA-Z]",data[i++]) != EOF &&
       fscanf(file,"%9[^a-zA-Z]",garbage) != EOF );