读取单词并将它们存储在 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
永远不会重置。我会存储 count
s 以便稍后打印,这可以用数组来完成,如果 1234567
在循环内,它是正常的,它将为扫描的每个单词打印 count
。如果您将 "%d "
与 space 一起使用,您将得到 1 2 3 4 5 6 7
.
下面的程序从用户那里获取 5 行,统计每行的字数并将计数存储在一个数组中,使用 scanf
和 strtok
来统计字数:
#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;
}
您应该使用 fgets
或 getline
,因为 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;
}
这里我用fgets
从stdin
一行一行获取。
该代码实际上计算了行中的空格并将它们加 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;
}
我正在尝试编写一个程序,逐字读取行并将每个字放在一个数组中(稍后我想对这些字进行一些操作,但现在这不是问题)并在输出中显示应该是每行中的一些单词。例如:
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
永远不会重置。我会存储 count
s 以便稍后打印,这可以用数组来完成,如果 1234567
在循环内,它是正常的,它将为扫描的每个单词打印 count
。如果您将 "%d "
与 space 一起使用,您将得到 1 2 3 4 5 6 7
.
下面的程序从用户那里获取 5 行,统计每行的字数并将计数存储在一个数组中,使用 scanf
和 strtok
来统计字数:
#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;
}
您应该使用 fgets
或 getline
,因为 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;
}
这里我用fgets
从stdin
一行一行获取。
该代码实际上计算了行中的空格并将它们加 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;
}