读取单词并将它们存储在 C 中的二维数组中

Reading words and storing them in 2-D array in C

我正在尝试编写一个程序,逐字读取行并将每个字放在一个数组中(稍后我想对这些字进行一些操作,但现在这不是问题)并在输出中显示应该是每行中的一些单词。例如:

input:
good morning my neighbors!
how are you?

output:
4
3

这是我的代码:

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

int main()
{
    char word[100];
    char wordArray[100][100];
    int count = 0;
    for(;scanf("%s", word)!=EOF;)
    {
        strcpy(wordArray[count], word);
        count++;
    }
    printf("%d", count);

    return 0;
}

但它在输出中只给出了 7(两行中所有单词的数量)。如果我将 printf 函数放在 for 循环中,那么我会得到 1234567 作为输出。我如何让它对一行中的单词进行计数并打印出来,然后将计数设置为零并在下一行重新开始?

它给你 7 因为 count 永远不会重置。我会存储 counts 以便稍后打印,这可以用数组来完成,如果 1234567 在循环内,它是正常的,它将为扫描的每个单词打印 count 。如果您将 "%d " 与 space 一起使用,您将得到 1 2 3 4 5 6 7.

下面的程序从用户那里获取 5 行,统计每行的字数并将计数存储在一个数组中,使用 scanfstrtok 来统计字数:

Demo

#include <stdio.h>
#include <string.h>
#define SIZE 5
#define LENGTH 100

int main()
{
    char word[LENGTH];
    char wordArray[SIZE][LENGTH];
    int count[SIZE] = {0}; //array to store the counts
    const char delimiter[] = " ";
    char *token;
    printf("Insert %d phrases:\n", SIZE);
    // %99[^\n] specifier also to avoid buffer overflow and read till newline
    for (int i = 0; i < SIZE && scanf(" %99[^\n]", wordArray[i]) == 1; i++)
    {
        strcpy(word, wordArray[i]);
        token = strtok(word, delimiter);
        while (token != NULL)
        {
            count[i]++;
            token = strtok(NULL, delimiter);
        }
    }
    for (int i = 0; i < SIZE; i++) {//print all the counts
        printf("string %d - \"%s\" - ", i + 1, wordArray[i]);
        printf("%d words\n", count[i]);
    }
    return 0;
}

您应该使用 fgetsgetline,因为 scanf 是逐字阅读,而不是一行中的所有单词。

代码:

#include <stdio.h>
#include <string.h>
#define SIZE 100

int main()
{
    char wordArray[SIZE][SIZE];
    int count[SIZE];
    int c = 0;
    while(fgets( wordArray[c], SIZE, stdin) && c < SIZE)
    { 
        for(int i = 0; wordArray[c][i] != '[=10=]' ; i++) {
            // remove enter character at the end of each line, not necessary in this case but mabe later when you work with all works
            wordArray[c][strcspn ( wordArray[c], "\n" )] = '[=10=]'; 
            if (wordArray[c][i] == ' ') {
                 count[c]++; // increase the number of words if we meet space character
            }
        }
        c++;
    }
    for (int i = 0; i < c; i++) //print all the counts
        printf("%d", count[i] + 1);

    return 0;
}

这里我用fgetsstdin一行一行获取。 该代码实际上计算了行中的空格并将它们加 1。我也没有使用 string.h.

#include <stdio.h>
#define SIZE 100

int main()
{
  int i=0;
  char lines[SIZE][SIZE];
  int count[SIZE]={0};
  while(i<SIZE){
    fgets(lines[i], SIZE, stdin);
    if (lines[i][0]=='\n') break;
    i++;
  }

  for(int j=0; j<i; j++){
    char *x=lines[j];
    while(*x!='[=10=]') {
      if (*x==' ') count[j]++;
      x++;
    }
    printf("%d\n", count[j]+1);
  }
  return 0;
}