如何从文本文件中读取单词并将其添加到字符串数组中?

2023-12-14

这是我的函数,调用方式为:getWord(words);

void getWord(char words[][MAXWORDLENGTH]){
int i;
char newWord[MAXWORDLENGTH];
FILE* file;
file = fopen("wordbank.txt","r");
if(file==NULL){
    printf("Error\n");
}else{
    printf("File read\n");
    for(i=0;i<=MAXWORDS;i++){
        fgets(newWord, "%s", file);
        printf("newWord: %s", newWord);
        strcpy(words[i], newWord);
    }

}
fclose(file);

}

不幸的是,我的数组“words”没有用字符串填充每个元素,它能够将文本文件中的第一个单词捕获到 [0] 元素中,然后其余的都是乱码。

我的文本文件如下所示:

apple
winter
summer
skunk
clouds
pencil
grape

使用指针而不是数组对我来说会更容易吗?

谢谢您的帮助!


好吧,你可能会让事情变得比他们需要的更困难。该评论并不是为了攻击您,但是无论您使用什么编译器/IDE,都应该左右吐出错误。它的编译结果令人惊讶。评论中的建议很合理。总是,always在您认为您的代码值得信赖之前,请在启用警告的情况下进行编译并修复所有警告。

话虽这么说,但你在某些方面却让自己变得很困难。您应该传递数组和FILE*指针(或文件名)而不是在函数中硬编码文件名。这使得该功能的用途非常有限。您的使用fgets正如您现在所知,这是不正确的。此外,在传递数组后,您只需将每个单词(假设每行 1 个)读入数组,同时确保不超过声明的行数。

这是一个简短的示例,将从命令行上给出的文件名(或从stdin默认情况下)。它利用了一个ternary运算符接受文件名作为第一个参数或设置fp to stdin。尝试一下,如果您有疑问请告诉我:

#include <stdio.h>

#define MAXW 64  /* maximum number of lines to read */
#define MAXC 32  /* longest word in abridged Dict. is 28 char
                    "Antidisestablishmentarianism"  */

size_t getwords (char (*words)[MAXC], FILE *fp);

int main (int argc, char **argv) {

    char words [MAXW][MAXC] = {{0}};    /* array to hold words  */
    size_t nwords = 0;                  /* number of words read */
    size_t i;

    /* open argv[1] for reading (default: stdin) */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

    if (!fp) {  /* validate file open */
        fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
        return 1;
    }

    nwords = getwords (words, fp);

    if (fp != stdin) fclose (fp);   /* close file */

    printf ("\n words read from '%s':\n\n",
            argc > 1 ? argv[1] : "stdin");
    for (i = 0; i < nwords; i++)
        printf ("  words[%2zu] : %s", i, words[i]);

    return 0;
}

/* function to read words, 1 - per line, from 'fp' */
size_t getwords (char (*words)[MAXC], FILE *fp)
{
    size_t idx = 0;                     /* index of words read */

    /* read each line in file into words array
       note: includes trailing newline character */
    while (idx < MAXW && fgets (words[idx], MAXC, fp)) {
        idx++;
        /* note you should check if chars remain in line */
    }

    if (idx == MAXW)   /* check word count against MAXW */
        fprintf (stderr, "warning: MAXW words read.\n");

    return idx;
}

Compile

gcc -Wall -Wextra -O3 -o bin/fgets_array_words_fn fgets_array_words_fn.c

输入文件

$ cat dat/captnjack1.txt
This
is
a
tale
Of
Captain
Jack
Sparrow
A
Pirate
So
Brave
On
the
Seven
Seas.

Output

$ ./bin/fgets_array_words_fn dat/captnjack1.txt

 words read from 'dat/captnjack1.txt':

  words[ 0] : This
  words[ 1] : is
  words[ 2] : a
  words[ 3] : tale
  words[ 4] : Of
  words[ 5] : Captain
  words[ 6] : Jack
  words[ 7] : Sparrow
  words[ 8] : A
  words[ 9] : Pirate
  words[10] : So
  words[11] : Brave
  words[12] : On
  words[13] : the
  words[14] : Seven
  words[15] : Seas.

或阅读自stdin:

$ ./bin/fgets_array_words_fn <dat/captnjack1.txt

 words read from 'stdin':

  words[ 0] : This
  words[ 1] : is
  ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从文本文件中读取单词并将其添加到字符串数组中? 的相关文章

随机推荐

  • 使用新版本的应用程序更新和更改设置 plist 文件

    我的应用程序的资源文件夹中有一个默认设置 plist 文件 并且在第一次启动时该文件被复制到文档文件夹中 在应用程序的后续版本中 如何将文档中的 plist 设置与自上一版本以来添加的任何新键和值 可能是嵌套的 合并 我见过一种模式 其中属
  • PowerShell New-CommandWrapper :为以下参数提供值

    我的意思是对输出进行着色ls 我检查了Powershell 一劳永逸地正确着色 Get Childitem 输出 这两个选项似乎是 Use New CommandWrapper 正如 OP 和 Jon Z 的回答中所提倡的那样 使用模块PS
  • R 用字典表替换列中的值而不使用合并或连接

    假设我有一个字典表 例如 id value 1 168833 2 367656 3 539218 4 892211 millions of lines 和一个原始数据框 例如 name code Abo 1 Cm3 2 LL2 6 JJ 1
  • 正确防止 Flex Mobile 应用程序中的方向变化

    有谁能够真正让它在 Flex SDK 4 6 中正常工作吗 这是一个简短的片段
  • VS2010中Boost.Thread抛出bad_alloc异常

    包括后
  • 运行时错误:java.lang.ClassNotFoundException:com.mysql.jdbc.Driver

    我是 mysql 和 jdbc 的新手 我收到了这个标题中的错误 我一整天都在寻找 找不到适合我的解决方案 我尝试过的 卸载 重新安装mysql 将mysql connector java 5 1 25 bin jar和ojdbc7 jar
  • Setter 不能与 -=、+= 等一起使用吗? [复制]

    这个问题在这里已经有答案了 我不明白为什么我会收到零错误 我正确创建了设置器 但它不接受 或 运算符后面的本身 为什么 class Test def var var 0 end def var value var value end def
  • 如何打破这个 while(true) 循环?

    您好 我试图打破这个循环 并在两个 if 语句都为 true 时返回坐标 然而 循环永远不会结束 我该如何修复它 public static String positionQuery int dim Scanner test in Scan
  • Lodash uniqBy更新最新值

    我有一系列如下所示的对象 id 27 unread message count 0 id 27 unread message count 7 我使用 lodash uniqBy 删除重复项 如下所示 uniqBy data id 它删除了重
  • iPhone iCloud 应用程序在 iOS 4 上编译时崩溃

    我想使用 iCloud 但是当我在 iOS 4 3 模拟器上编译该应用程序时 它崩溃了 dyld 找不到符号 OBJC CLASS NSMetadataQuery 我应该怎样做才能使其在 iOS 3 4 和 5 上运行 我的解决方案是 NS
  • 任意解引用指针的输出

    我将内存填充如下 char buf 8 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 然后将 unsigned long 指针依次放在前 5 个字节上并输出结果 char c ptr unsigned lo
  • 编译 .java 文件时无法找到符号错误

    再会 我在同一目录中有两个类 Map 和 Field 我成功编译了 Field java 但是当我编译 Map java 时 我得到了这个 Map java 4 error cannot find symbol private Field
  • jQuery 创建带有 ID 的新 div?

    我的 ASP NET masterPage master 中有表单 如果我单击 提交 它会通过 ajax 调用 masterPage master cs 文件中的某些方法 我在更新面板中有它 但我想用 jQuery 改进它 所以我有这个 s
  • 代码在不应该生效的时候生效了

    我有一个功能 如果用户单击按钮 它将在文本框中显示一个值 并在单击 btn 按钮后执行另一个功能的触发 function addwindow numberAnswer gridValues btn mainNumberAnswerTxt v
  • 在 BeautifulSoup 中用字典解析脚本标签

    正在研究部分答案this问题 我遇到了一个bs4 element Tag这是一堆嵌套的字典和列表 s 以下 有没有办法返回包含的网址列表s without using re find all 关于此标签结构的其他评论也很有帮助 from b
  • Flash 图像上传需要强制裁剪吗?

    有人知道 Flash 文件 图像 上传器会强制用户在上传之前调整图像大小和 或裁剪图像吗 然后也上传它 基本上 我不希望我的服务器处理图像调整大小 裁剪 我想指定目标纵横比 并让用户调整大小并裁剪图像以使其适合 我以前见过裁剪上传器 但它们
  • 通过C连接oracle DB

    我想在Windows操作系统中使用C语言连接oracle数据库 但我不知道如何开始 以及先决条件是什么 任何人都可以为我提供任何帮助 教程或示例代码吗 谢谢 http www dreamincode net forums topic 307
  • JavaFX:同时有 2 个独立窗口

    我想一次创建2个独立的窗口 一个窗口将能够保存可观察的列表 另一个窗口将显示所选列表对象的属性 我正在尝试将列表视图创建为通用列表 并将其与特定于对象的窗口 例如客户属性 啤酒属性 商店属性 结合起来 简而言之 如果用户单击 客户 它将显示
  • Worklight 和 jquery:我想要获取 xml 中存在的链接并使用行动态标记它们?

    上面附加了我的图像 该图像将其提取到远程服务器 其显示为内容页面中的行 我在同一个 xml 中有链接 我想将该链接标记为该行 然后单击它 用户应该加载页面 我怎样才能获取它 function displayFeeds items var u
  • 如何从文本文件中读取单词并将其添加到字符串数组中?

    这是我的函数 调用方式为 getWord words void getWord char words MAXWORDLENGTH int i char newWord MAXWORDLENGTH FILE file file fopen w