2016-10-13 12 views
0

文字列を取る関数(例: "Hello I am stackoverflow")を作成し、その文字列を所定の幅で印刷しようとしています。幅がこんにちは10特定の長さの文字列をCの2次元配列に取得する方法

を言っていたのであれば、私はstackovに

erflow

`void Left(char* words, int width) 
{ 
    int length = strlen(words); 
    int divisions = length/width; //How many lines there will be 
    if (divisions%length!=0) divisions+=1; //If some spillover 
    printf("%d = divisions \n", divisions); 
    char output[divisions][width]; 
    int i; 
    int temp; 
    for(i=0; i < divisions; i++) 
    { 
     strncpy(output[i][temp], words, width); 
     output[i][width] = '\0'; 
     temp+= width; 
    } 
}` 

は、これは私がこれまでで書かをした機能です。そのため、出力には、新しい行がある行と同じ数の行があり、各行は幅で指定されたテキストを多く含みます。私はstrncpyを間違って使用していると思うが、わからない。どんな助け?

+0

ようこそスタックオーバーフロー!良い質問をするのを助けるために私たちの[SO Question Checklist](http://meta.stackoverflow.com/questions/260648/stack-overflow-question-checklist)をよく読んで、良い答えを得てください。 –

答えて

1

が最初に認識する必要があります

char output[divisions][width]; 

は、char型の文字列サイズの各「幅」の「分裂」の数が含まれている文字列の配列です。そして、strncpyは、デスティネーションバッファの引数として 'char *'をとります。 http://man7.org/linux/man-pages/man3/strcpy.3.html

したがって、あなたの場合のデータをコピーするために、あなたはこれが文字列からデータの「幅」の長さをコピーします

strncpy(&output[i], words, width); 

below-として先の文字列を提供する必要がある文字列「を出力する言葉 " [私]'。

あなたの関数が機能するようになると、各繰り返しの後に '単語'ポインタを前方に移動させる必要があります。たとえば:あなたは、次の反復で11バイトから対処を開始する必要があるので 「こんにちは私は」に「言葉」からコピーされbytes-最初の10「の出力は、[0]」これだけ追加

words += width; 
printf("%s \n", output[i]); 

また、前の答えで述べたように、文字列ターミネータやその他の境界条件を忘れないでください。

0

文字列の幅に文字列ターミネータが含まれていないため、output[i][width] = '\0';はターミネータを範囲外に書き出します。あなたは正しい方向にしかし、いくつかのことを行っている

+0

これをインクリメントすることで修正しましたが、私はまだこのエラーを受けています。 – Unborn

+0

警告*警告: 'strncpy'の引き数1はキャストなしで整数からポインタを作成します。 int – Unborn

関連する問題