2012-04-25 11 views
0

文字列に文字を1つずつ追加しようとしています。私はこのようなものがあります:Cビルド文字列charで既知の最大長を持つ文字

void doline(char *line, char *buffer, char** tokens){ 
} 

をし、私は好き、それを呼び出しています:

char *line = malloc(1025 * sizeof(char *)); 
fgets(line, 1024, stdin); 
int linelength = strlen(line); 
if (line[linelength - 1] == '\n'){ 
    line[linelength - 1] = '\0'; 
} 

char ** tokens = (char **) malloc(strlen(line) * sizeof(char *)); 
char *emptybuffer = malloc(strlen(line) * sizeof(char *)); 

parseline(line, emptybuffer, tokens); 

だから、ドリーネはトークンに様々な条件とその場所の断片に基づいてラインを通過し、それをトークン化します。変数バッファーにtemp文字列を作成しています。これを行うには、を1文字ずつ実行する必要があります。

buffer[strlen(buffer)] = line[i]; 

そして、ループの終わりに:

私は現在やっている。しかし

*buffer++ = '\0'; 

これが結果です:

printf("Working on line: '%s' %d\n", line, strlen(line)); 

出力:ライン上での作業: 'テスト' 4

しかし、関数の最後でバッファがされていますので、出力文字列が台無しになっていることを示している「テスト」7

*buffer++ = '\0'; 
printf("Buffer at the very end: '%s' %d\n", buffer, strlen(buffer)); 

出力:非常に最後のバッファー。キャラクターごとにこの文字列を作成する最良の方法は何ですか?私の弦の操作は正しいですか?

任意の助けもいただければ幸いです!

ありがとうございます!

+1

'strlen()'は、終了する '\ 0'が存在する場合にのみ動作します。終了文字列に文字を追加するためにそれを使用しようとすると(または終端文字を追加すると!)、終わりを近づけるでしょう。 – geekosaur

+0

ああ、それは賢明です。私はインデックスとしてstrlenを利用できない場合、これを行うための最良の方法は何ですか? – Rila

+1

私は何のインデックスの内部カウントを維持しようとすることができます。私はこれを試してみましょう! – Rila

答えて

1

基本的な問題がありましたので、私はプログラムを書き直しました。

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

#define str_len 180 

void tokenize(char *str, char **tokens) 
{ 
    int length = 0, index = 0; 
    int i = 0; 
    int str_i; 
    int tok_i; 

    while(str[length]) { 
     if (str[length] == ' ') { 
      /* this charecter is a space, so skip it! */ 
      length++; 
      index++; 

      tokens[i] = malloc(sizeof(char) * index); 

      tok_i = 0;   
      for (str_i=length-index ; str_i<length; str_i++) { 
       tokens[i][tok_i] = str[str_i]; 
       tok_i++; 
      } 

      tokens[i][tok_i] = '\0'; 
      i++; 
      index = 0; 
     } 
     length++; 
     index++; 
    }  

    /* copy the last word in the string */ 
    tokens[i] = malloc(sizeof(char) * index); 
    tok_i = 0;   
    for (str_i=length-index ; str_i<length; str_i++) { 
     tokens[i][tok_i] = str[str_i]; 
     tok_i++; 
    } 
    tokens[i][tok_i] = '\0'; 
    tokens[i++] = NULL; 

    return;   
} 

int main() 
{ 
    char *str = malloc(str_len * sizeof(char)); 
    char **tokens = malloc(100 * sizeof(char *)); 
    int i = 0; 

    if (str == NULL || tokens == NULL) 
     return 1; 

    gets(str); 
    printf("input string: %s\n", str); 
    tokenize(str, tokens); 

    while(tokens[i] != NULL) { 
     printf("%d - %s \n", i, tokens[i]); 
     i++; 
    } 

    while(tokens[i]) 
     free(tokens[i]); 
    free(tokens); 
    free(str); 

    return 0; 
} 

次のようにコンパイルして実行されます。

$ gcc -ggdb -Wall prog.c 
$ ./a.out 
this is a test string... hello world!! 
input string: this is a test string... hello world!! 
0 - this 
1 - is 
2 - a 
3 - test 
4 - string... 
5 - hello 
6 - world!! 
$ 

いくつかの基本的な仮定がありました:

  1. 入ってくる文字列の長さが一定と仮定されるが。これは動的に行うことができます - How to read a line from the console in C?を確認してください。

  2. トークン配列の長さも定数とみなされます。これは変更することもできます。方法を見つけるために私はあなたにそれを残します!

希望します。

関連する問題