2016-11-22 16 views
1

私は昨夜、この小さなコードをデバッグするのに過ごしました。私は2つのデータテキストファイルを持っていて、どちらも18000文字を含んでいます。 Idは、これらの18000を100個の文字の2つのサブストリングに分割して、180回の反復を行うのが好きです。部分文字列をCに渡す

最初の180回の反復では、両方のサブストリングのサイズは問題ありません。 18回の反復の後、サブストリングのサイズは0です。

両方のファイルが適切に開かれました。私はそれらを印刷することができます。私は考えることができるすべての可能な方法でサブ文字列を割り当てようとしましたが、これまでのところ解決策が見つかりませんでした。

int main(int argc, char const *argv[]) { 

    //Ive loaded two files into two strings buff1 and buff2 both size of 18000 chars 
    //It works fine with small data example, I dunno why but eventually I have work with much more bigger data set 
    //Id like to divide them into 100 char long pieces and do some stuff with that 

    char *substrA;  //substring for buff1 
    char *substrB;  //substring for buff2 

    substrA = malloc((wlen+1)*sizeof(char));  //word length wlen=100 
    substrA = malloc((wlen+1)*sizeof(char)); 

    for (int i= 0; i <numOfSubProblems; ++i){ //numOfSubProblems = 18000/100 

     strncpy(substrA, buff1+i*wlen, wlen); 
     strncpy(substrB, buff2+i*wlen, wlen); 
     substrA[wlen] = '\0'; 
     substrA[wlen] = '\0'; 

     int lenA = strlen(substrA); 
     int lenB = strlen(substrB); 
     printf("STRA a STR B: %d %d \n",lenA,lenB); 

     DoSomething(substrA,substrB,i); //some parser and other functionality 
    } 
    return 0; 
} 
+0

ここで 'subA'と' subB'は宣言されていますか? –

+0

'malloc()' + 'strncpy()'の代わりに 'strndup()'を使うのはどうですか? – glauxosdever

+0

それでは、何が問題なのですか? – LPs

答えて

7

strncpy宛先文字列をヌル終了しません。だから、そうでなければ、あなたがstrlenを使用することはできませんし、そうするとき、あなたが彼らの最後の後ろのバッファにアクセス

strncpy(subA, buff1+i*wlen, wlen); 
subA[wlen] = '\0'; 
strncpy(subB, buff2+i*wlen, wlen); 
subB[wlen] = '\0'; 

を行う必要があります。

+0

オーマイ神イムな馬鹿、18日に同じ問題 –

+0

は 'strncpy'は非常によく先の文字列を終了した後、サイズの問題を解決し、それでも問題はそれらの反復としているおかげ** *ない限りを投稿してください*配列に収まらない。 destrination配列の長さが保証されているので、 'strcpy'を使うか' wlen + 1'を渡すこともできます。しかし、ここでは 'memcpy'がより適切でしょう。 – Olaf

+1

これは、文字列を終了しない場合は、それをコピー「\ 0」は最初 'len'文字(OK、基本的には同じ結果) –

0

snprintfを使用してください。

文字列を書式設定することはできませんが、少なくともそれは正常なAPIです。サブ問題の数を決めるときにも切り上げてください:

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

#define PROBSIZE 18002 

int main (int argc, char **argv) { 
    char input[PROBSIZE]; 

    for (size_t i = 0; i < PROBSIZE; ++i) { 
     input[i] = 'A' + (i % 10); 
    } 

    const size_t wlen = 10; 
    char *subA = malloc (wlen + 1); 
    if (!subA) { 
     return EXIT_FAILURE; 
    } 

    for (int i = 0; i < (PROBSIZE + wlen - 1)/wlen; ++i) { 
     /* If there's no error, guarantees `wlen` characters copied */ 
     int err = snprintf(subA, wlen + 1, "%s", input + i * wlen); 

     if (err < 0) { 
      fprintf(stderr, "snprintf encountered an error\n"); 
      return EXIT_FAILURE; 
     } 

     /* In absence of errors, we expect that the return value is 
     * always >= wlen + 1, except the last iteration. 
     */ 
     assert(err >= wlen + 1 || i == ((PROBSIZE + wlen - 1)/wlen) - 1); 

     printf("%s\n", subA); 
    } 

    return EXIT_SUCCESS; 
} 
関連する問題