2016-12-15 15 views
-2

私は、スペースを数えずに、入力されたテキストの文字数を数えるプログラムを作ろうとしていました。私は2D配列でそれをしなければならないことは分かっていますが、単語の集合を入力すると、ここのループは最初の単語の文字だけをカウントします。Cで2D配列を入力するにはどうすればよいですか?

char text[400][40]; 
int charNum = 0; 
int i = 0; 
int j = 0; 


printf("input string: \n"); 
scanf("%s", &text); 
while(text[i] != '\0'){ 
    while(text[i][j] != '\0'){ 
     printf("\n\nword: %s\n", text[i]); 
     printf("\n\nchar:%c\n", text[i][j]);  
     charNum = charNum + j; 
     j++; 
     printf("J= %d\n", j); 
    } 
    i++; 
} 

どのように入力ループはその中の各文字列を読むことができるように、2次元配列の操作を行います。ここでは

はメインのコードですか?

+1

ヒント:。。 'のscanf( "%sの"、&text);は' outrigjht間違っているデータの種類を確認してください –

+0

しかし、ありえないすべての文字列は、charとして宣言、およびscanfに%sを持っていますか? –

+0

可能な複製[this](http://stackoverflow.com/questions/8211087/how-to-fill-a-2d-array-in-c-with-user-input-values) 解決策を見つけることができます –

答えて

0

入力がchar text [400] [40]に格納されると宣言しました。つまり、それぞれ40文字の長さの400語を格納できます。 scanfを使用している場合に単語を入力すると、scanfは入力された最初のスペースまでのみ入力を受け取ります。入力単語を読むためにfgetsを使用してください。 例: text [0] = "john"; text [1] = "xyzxyz xyz"; あなたはfgetsを使って両方のフォーマットを読むことができます。

+0

しかし、ファイルから文字列を取得するためにのみ使用されるisntファイルはありませんか? –

+0

"*はそれぞれ40文字の長さです。Cの文字列は '0'終端を格納するためにもう一つの' char'を必要とするので、 '' no''、 '' not、not、not、not ''の3つの '' char'sのみを使用します。 – alk

+0

ファイルはstdinとstdoutにもなります。ファイルポインタとファイルポインタを標準入力に初期化することができます –

0

fgetsを入力文字列、strtokを使用して各文字列を解析することができます。

この仕事ができるような何か:

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

#define NUMWORDS 400 
#define WORDLEN 40 
#define BUFFSIZE 100 

int 
main(void) { 
    char text[NUMWORDS][WORDLEN]; 
    char line[BUFFSIZE], *word; 
    size_t slen, count = 0; 
    int i; 

    printf("Enter some words: "); 
    if (fgets(line, BUFFSIZE, stdin) == NULL) { 
     printf("Error reading into buffer.\n"); 
     exit(EXIT_FAILURE); 
    } 

    slen = strlen(line); 
    if (slen > 0) { 
     if (line[slen-1] == '\n') { 
      line[slen-1] = '\0'; 
     } else { 
      printf("Exceeded buffer length of %d.\n", BUFFSIZE); 
      exit(EXIT_FAILURE); 
     } 
    } 

    if (!*line) { 
     printf("No words entered.\n"); 
     exit(EXIT_FAILURE); 
    } 

    word = strtok(line, " "); 
    while (word != NULL) { 
     if (strlen(word) >= WORDLEN) { 
      printf("\nYour word \"%s\" is longer than word size limit: %d\n", 
         word, WORDLEN); 
      exit(EXIT_FAILURE); 
     } 
     strcpy(text[count], word); 
     count++; 
     word = strtok(NULL, " \n"); 
    } 

    if (count > NUMWORDS) { 
     printf("Too many words entered.\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("\nYour array of strings:\n"); 
    for (i = 0; i < count; i++) { 
     printf("text[%d] = %s\n", i, text[i]); 
    } 

    return 0; 
} 

入力:

Enter some words: sadsad asdasdasd asdasdasdasd 

出力:

Your array of strings: 
text[0] = sadsad 
text[1] = asdasdasd 
text[2] = asdasdasdasd 
0

あなただけの入力テキストの文字をカウントしたい場合は?

int main() 
{ 
    int size = 0; 
    char input[200] = "This is an input string"; 
    size = mystrlen(input); 
    printf("size=%d", str); 
    return 0 

} 

int mystrlen(char *s) 
{ 
    int i = 0; 
    while (*s++) { 
     if (*s != 32) 
      i++; 
    } 
    return i; 
} 
output: size = 19; 
0

という理由だけでは、第一のスペースまで読んscanf関数:私はこのような何か(!もし(* S = 32)空白をカウントしないことです、ASCII「スペース」=十進32)を行っているでしょう。 ここで取得する必要があります。 このスペースのない単純なcaracterカウントのため:すべてのscanfの

char str [100]; 
int i=0,cpt=0; 
printf ("Enter some words: "); 
gets (str); 
While(str [i]!='\0'){ 
    if (str [i]!=' '){ 
     cpt++; 
    } 
    i++; 
} 

printf ("Size: %d",cpt); 
+0

'gets()'を使わないでください。悪意があり、Cの部分ではありません。代わりに 'fgets()'を使用してください。 – alk

0

まず( "%sの"、&テキスト)。スペースを使用しないでください。名前に最初のスペースが出現するまで読み取ります。 scanf( "%[^/n] s"、&テキスト)を使用します。代わりに名前をスペースで読み取るようにします。 2D配列を読み取る方法が間違っています。簡単な方法はforループを使うことです。

例:

for (i=0;i<n;i++) 
{ 
    scanf ("%[^/n]s,text[i]); 
} 
関連する問題