文字列内の単語をカウントする関数を作成する必要があります。この割り当ての目的のために、「単語」は、空白によって他の単語から分離された、非ヌル、非空白文字のシーケンスとして定義されます。
これは私がこれまでに持っているものです:
int words(const char sentence[ ]);
int i, length=0, count=0, last=0;
length= strlen(sentence);
for (i=0, i<length, i++)
if (sentence[i] != ' ')
if (last=0)
count++;
else
last=1;
else
last=0;
return count;
プログラム全体が終了するまでテストできず、機能するかどうかわからないため、機能するかどうかわかりません。この関数を作成するためのより良い方法はありますか?
あなたが必要だった
int words(const char sentence[])
{
}
(中括弧に注意してください)。
Forループは;
の代わりに ,
。
免責事項なしで、これが私が書いたものです:
ライブで見るhttp://ideone.com/uNgPL
#include <string.h>
#include <stdio.h>
int words(const char sentence[ ])
{
int counted = 0; // result
// state:
const char* it = sentence;
int inword = 0;
do switch(*it) {
case '\0':
case ' ': case '\t': case '\n': case '\r': // TODO others?
if (inword) { inword = 0; counted++; }
break;
default: inword = 1;
} while(*it++);
return counted;
}
int main(int argc, const char *argv[])
{
printf("%d\n", words(""));
printf("%d\n", words("\t"));
printf("%d\n", words(" a castle "));
printf("%d\n", words("my world is a castle"));
}
次の例を参照してください。次のアプローチに従うことができます:単語間の空白を数えます。
int words(const char *sentence)
{
int count=0,i,len;
char lastC;
len=strlen(sentence);
if(len > 0)
{
lastC = sentence[0];
}
for(i=0; i<=len; i++)
{
if((sentence[i]==' ' || sentence[i]=='\0') && lastC != ' ')
{
count++;
}
lastC = sentence[i];
}
return count;
}
テストする :
int main()
{
char str[30] = "a posse ad esse";
printf("Words = %i\n", words(str));
}
出力:
Words = 4
#include <ctype.h> // isspace()
int
nwords(const char *s) {
if (!s) return -1;
int n = 0;
int inword = 0;
for ( ; *s; ++s) {
if (!isspace(*s)) {
if (inword == 0) { // begin Word
inword = 1;
++n;
}
}
else if (inword) { // end Word
inword = 0;
}
}
return n;
}
bool isWhiteSpace( char c )
{
if( c == ' ' || c == '\t' || c == '\n' )
return true;
return false;
}
int wordCount( char *string )
{
char *s = string;
bool inWord = false;
int i = 0;
while( *s )
{
if( isWhiteSpace(*s))
{
inWord = false;
while( isWhiteSpace(*s) )
s++;
}
else
{
if( !inWord )
{
inWord = true;
i++;
}
s++;
}
}
return i;
}
#include<stdio.h>
#include<string.h>
int getN(char *);
int main(){
char str[999];
printf("Enter Sentence: "); gets(str);
printf("there are %d words", getN(str));
}
int getN(char *str){
int i = 0, len, count= 0;
len = strlen(str);
if(str[i] >= 'A' && str[i] <= 'z')
count ++;
for (i = 1; i<len; i++)
if((str[i]==' ' || str[i]=='\t' || str[i]=='\n')&& str[i+1] >= 'A' && str[i+1] <= 'z')
count++;
return count;
}
#include <stdio.h>
int wordcount (char *string){
int n = 0;
char *p = string ;
int flag = 0 ;
while(isspace(*p)) p++;
while(*p){
if(!isspace(*p)){
if(flag == 0){
flag = 1 ;
n++;
}
}
else flag = 0;
p++;
}
return n ;
}
int main(int argc, char **argv){
printf("%d\n" , wordcount(" hello world\nNo matter how many newline and spaces"));
return 1 ;
}
受講しているCクラスの関数を終了した後、投稿された質問を見つけました。私は人々が上に投稿したコードからいくつかの良いアイデアを見ました。これが私が答えのために思いついたものです。それは確かに他のものほど簡潔ではありませんが、それは機能します。多分これは将来誰かを助けるでしょう。
私の関数は文字の配列を受け取ります。次に、配列へのポインターを設定して、関数がスケールアップされた場合に関数を高速化します。次に、ループする文字列の長さを見つけました。次に、文字列の長さを「for」ループの最大値として使用します。次に、array [0]を参照しているポインターをチェックして、それが有効な文字または句読点であるかどうかを確認します。ポインタが有効な場合は、次の配列インデックスにインクリメントします。最初の2つのテストが失敗すると、ワードカウンターが増加します。次に、関数は、次の有効な文字が見つかるまで、任意の数のスペースでインクリメントします。 null '\ 0'または改行 '\ n'文字が見つかると、関数は終了します。関数は、nullまたは改行の前にあるWordを考慮して、終了する直前に最後にもう一度カウントをインクリメントします。関数は、呼び出し元の関数にカウントを返します。
#include <ctype.h>
char wordCount(char array[]) {
char *pointer; //Declare pointer type char
pointer = &array[0]; //Pointer to array
int count; //Holder for Word count
count = 0; //Initialize to 0.
long len; //Holder for length of passed sentence
len = strlen(array); //Set len to length of string
for (int i = 0; i < len; i++){
//Is char punctuation?
if (ispunct(*(pointer)) == 1) {
pointer += 1;
continue;
}
//Is the char a valid character?
if (isalpha(*(pointer)) == 1) {
pointer += 1;
continue;
}
//Not a valid char. Increment counter.
count++;
//Look out for those empty spaces. Don't count previous
//Word until hitting the end of the spaces.
if (*(pointer) == ' ') {
do {
pointer += 1;
} while (*(pointer) == ' ');
}
//Important, check for end of the string
//or newline characters.
if (*pointer == '\0' || *pointer == '\n') {
count++;
return(count);
}
}
//Redundent return statement.
count++;
return(count);
}
別の解決策は次のとおりです。
#include <string.h>
int words(const char *s)
{
const char *sep = " \t\n\r\v\f";
int Word = 0;
size_t len;
s += strspn(s, sep);
while ((len = strcspn(s, sep)) > 0) {
++Word;
s += len;
s += strspn(s, sep);
}
return Word;
}
私はこれを課題として持っていました...だから私はこれがうまくいくことを知っています。この関数は、単語数、平均単語長、行数、文字数を提供します。単語を数えるには、isspace()を使用して空白をチェックする必要があります。 isspaceが0の場合、空白を読んでいないことがわかります。 wordCounterは、連続する文字を追跡するための単なる方法です。空白になったら、そのカウンターをリセットし、wordCountをインクリメントします。以下の私のコード:
Isspace(c)を使用して
#include <stdio.h>
#include <ctype.h>
int main() {
int lineCount = 0;
double wordCount = 0;
double avgWordLength = 0;
int numLines = 0;
int wordCounter = 0;
double nonSpaceChars = 0;
int numChars = 0;
printf("Please enter text. Use an empty line to stop.\n");
while (1) {
int ic = getchar();
if (ic < 0) //EOF encountered
break;
char c = (char) ic;
if (isspace(c) == 0 ){
wordCounter++;
nonSpaceChars++;
}
if (isspace(c) && wordCounter > 0){
wordCount++;
wordCounter =0;
}
if (c == '\n' && lineCount == 0) //Empty line
{
break;
}
numChars ++;
if (c == '\n') {
numLines ++;
lineCount = 0;
}
else{
lineCount ++;
}
}
avgWordLength = nonSpaceChars/wordCount;
printf("%f\n", nonSpaceChars);
printf("Your text has %d characters and %d lines.\nYour text has %f words, with an average length of %3.2f ", numChars, numLines, wordCount, avgWordLength);
}
#include<stdio.h>
int main()
{
char str[50];
int i, count=1;
printf("Enter a string:\n");
gets(str);
for (i=0; str[i]!='\0'; i++)
{
if(str[i]==' ')
{
count++;
}
}
printf("%i\n",count);
}