C 从文件到数组读取和存储整个单词

C 从文件到数组读取和存储整个单词,c,file,text,C,File,Text,我想分析文本文件中的单词(每个单词的长度、起始字符等)。要做到这一点,第一步是从文件中读取每个单词,然后继续存储在数组中 在下面的代码中,我设法将所有字符存储在一个数组中,但没有将它们分离成单词 #include <stdio.h> #include <stdlib.h> FILE *inp; char arr[100]; int i = 0; int word_count = 0; char c; int char_count = 0; inp = fopen("

我想分析文本文件中的单词(每个单词的长度、起始字符等)。要做到这一点,第一步是从文件中读取每个单词,然后继续存储在数组中

在下面的代码中,我设法将所有字符存储在一个数组中,但没有将它们分离成单词

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


FILE *inp;
char arr[100];
int i = 0;
int word_count = 0;
char c;
int char_count = 0;

inp = fopen("string_in.txt", "r");

    while ((c = fgetc(inp)) != EOF) {
    if (c == ' ' || c == '\n') {
        printf("\n");
        arr[char_count] = c;
        word_count++;
    }
    else {
        //printf("%c", c); //print to check if file is being read correctly
        arr[char_count] = c; 
        printf("%c",arr[char_count]);
    }   
    char_count++;
}
printf("\n");
printf("Chars: %d, Words: %d\n", char_count, word_count+1);

printf("From array: \n");
for(i = 0; i <= word_count; i++) {
    printf("%c",arr[word_count]);
}

printf("\n");
fclose(inp);

return (EXIT_SUCCESS);
输出:

This
is
a
test
Chars: 15, Words: 4
From array:
This is a test
我想访问以下元素:

arr[0] = 'This'
arr[3] = 'Test'
但由于我是按字符而不是按单词排列的:

arr[0] = 'T'
arr[3] = 's'
关于如何将其扩展到存储完整单词,有什么建议吗


编辑:

根据以下答案:

while ((c = fgetc(inp)) != EOF) {
if (c == ' ' || c == '\n') {
    printf("\n");

    arr[word_count][char_count] = '\0'; //Terminate the string
    char_count = 0; //Reset the counter.
    word_count++;
}
else {
     arr[word_count][char_count] = c; 
     printf("%c",arr[word_count][char_count]);
}   
(char_count < 99)? (char_count++):(char_count = 0);
}


printf("From array: \n");
for(i = 0; i < word_count; i++) {
    printf("%s",arr[word_count]);
}

当前您有空间存储单个
字符串

char arr[100]; -->char arr[100][100];
然后你的阅读改变如下

while ((c = fgetc(inp)) != EOF) {
    if (c == ' ' || c == '\n') {
        printf("\n");

        arr[word_count][char_count] = '\0'; //Terminate the string
        char_count = 0; //Reset the counter.
        word_count++;
    }
    else {
         arr[word_count][char_count] = c; 
         printf("%c",arr[word_count][char_count]);

         if (char_count < 99)
              char_count++;
            else
              char_count = 0;
    }   
}
while((c=fgetc(inp))!=EOF){
如果(c=''| | c='\n'){
printf(“\n”);
arr[word\u count][char\u count]='\0';//终止字符串
char\u count=0;//重置计数器。
字数++;
}
否则{
arr[word\u count][char\u count]=c;
printf(“%c”,arr[word_count][char_count]);
如果(字符数<99)
字符计数++;
其他的
字符计数=0;
}   
}
您的打印更改如下

for(i = 0; i < word_count; i++) {
    printf("%s",arr[i]);
}
for(i=0;i
当前您有空间存储单个
字符串

char arr[100]; -->char arr[100][100];
然后你的阅读改变如下

while ((c = fgetc(inp)) != EOF) {
    if (c == ' ' || c == '\n') {
        printf("\n");

        arr[word_count][char_count] = '\0'; //Terminate the string
        char_count = 0; //Reset the counter.
        word_count++;
    }
    else {
         arr[word_count][char_count] = c; 
         printf("%c",arr[word_count][char_count]);

         if (char_count < 99)
              char_count++;
            else
              char_count = 0;
    }   
}
while((c=fgetc(inp))!=EOF){
如果(c=''| | c='\n'){
printf(“\n”);
arr[word\u count][char\u count]='\0';//终止字符串
char\u count=0;//重置计数器。
字数++;
}
否则{
arr[word\u count][char\u count]=c;
printf(“%c”,arr[word_count][char_count]);
如果(字符数<99)
字符计数++;
其他的
字符计数=0;
}   
}
您的打印更改如下

for(i = 0; i < word_count; i++) {
    printf("%s",arr[i]);
}
for(i=0;i
您可以使用字符**完全存储单词

数组[100][100]

因为在数组[100]中存储单个字符串,所以在访问数组[0]时,只能访问该字符串的第一个字母


您需要修改代码并实现一个双数组而不是单个数组

您可以使用字符**来完全存储单词

数组[100][100]

因为在数组[100]中存储单个字符串,所以在访问数组[0]时,只能访问该字符串的第一个字母


您需要修改代码并实现双数组,而不是像其他用户所说的那样实现单个数组,您必须使用2D数组。它们是这样声明和初始化的:
arr[10][100]
(10是要存储的字数,根据需要更改)

while((c=fgetc(inp))!=EOF){
如果(c=''| | c='\n'){
printf(“\n”);
arr[word_count][char_count]='\0';
字符计数=0;
字数++;
}
否则{
arr[word\u count][char\u count]=c;
printf(“%c”,arr[word_count][char_count]);
字符计数++;
}
if(char\u count>=100)//在单词太长时的安全性
字符计数=0;
}
字数++;
printf(“\n”);
printf(“字符数:%d,单词数:%d\n”,字符数,单词数);
printf(“来自数组:\n”);
对于(i=0;i

请记住,因为每次有新词时我都会重置字符计数,所以循环后的值不会是您期望的值(它将只是最后一个单词的长度),并且printf中显示的值将是错误的。如果你真的关心它,你必须创建另一个变量。

正如其他用户所说,你必须使用2D数组。它们是这样声明和初始化的:
arr[10][100]
(10是要存储的字数,根据需要更改)

while((c=fgetc(inp))!=EOF){
如果(c=''| | c='\n'){
printf(“\n”);
arr[word_count][char_count]='\0';
字符计数=0;
字数++;
}
否则{
arr[word\u count][char\u count]=c;
printf(“%c”,arr[word_count][char_count]);
字符计数++;
}
if(char\u count>=100)//在单词太长时的安全性
字符计数=0;
}
字数++;
printf(“\n”);
printf(“字符数:%d,单词数:%d\n”,字符数,单词数);
printf(“来自数组:\n”);
对于(i=0;i

请记住,因为每次有新词时我都会重置字符计数,所以循环后的值不会是您期望的值(它将只是最后一个单词的长度),并且printf中显示的值将是错误的。如果你真的关心它,你必须创建另一个变量。

你没有存储完整的单词。你没有存储完整的单词。非常感谢你的回答。我们将对此进行测试。如果三值运算符以
char\u count==0
结束,而不是
=0
?@Rrz0否,如果达到100个字符,我将把
char\u count
重置为0。这只是为了避免越界进入。实际上,这一条件不应满足。如果需要,您应该保留更多内存。出于某种原因,我还没有弄清楚,我一直在该行上获取
所需的左值作为赋值的左操作数。请将那个可怕的条件表达式更改为正常的
if
语句。是的,您是对的。它与if-else语句一起工作!谢谢你的回答。我们将对此进行测试。如果三值运算符以
char\u count==0
结束,而不是
=0
?@Rrz0否,如果达到100个字符,我将把
char\u count
重置为0。这只是为了避免越界进入。实际上,这一条件不应满足。如果需要的话,您应该保留更多内存。由于某种原因,我还没有弄清楚我一直将
所需的左值作为