2016-05-25 4 views
0

これはプログラムの最初の部分であり、どの部分が正確に機能するかについていくつか質問があります。これが私が書いた最初のCプログラムであることに留意してください。 scanf( "%d"、& numberOfTimes); &が必要な理由とは何ですか? char入力[] [200];これは基本的に文字列の配列ですか、それともまったく別のものですか?C言語のchar配列の最初の半分にある文字をすべて検出するプログラム

#include <stdio.h> 
#include <string.h> 
char outputs[100]; 
char input[][200]; 
int numberOfTimes; 

void io(void){ 
    scanf("%d", &numberOfTimes); 
    for(int i = 0; i < numberOfTimes; i++){ 
     scanf("%s",input[i]); 
    } 
} 

このコードの次の部分は、実際に問題を解決するために私の試みですが、私は、関数の使用を台無ししかし、私は私が手にするために、不適切なものを使用した1か分からないと思われますこの結果。 (私は私のコード例を下に示しています)。

void stringManipulation(char string[200]){ 
    int strLength = strlen(string); 
    int number = strLength/2; 
    for(int i = 0; i <= number; i=i+2){ 
     strcat(outputs,&string[i]); 
    } 
} 



int main(void) { 
    io(); 
    for(int i = 0; i < numberOfTimes; i++) { 
     stringManipulation(input[i]); 
     printf("%s\n",outputs); 
     memset(&outputs[0], 0, sizeof(outputs)); 
    } 
    return 0; 
} 

memsetを正しく使用しましたか?再び私は&の使用を理解していません。

例入力:

4 

your 

progress 

is 

noticeable 

予想される出力:

y 

po 

i 

ntc 

私は取得しています出力:

yourur 

progressogressress 

is 

noticeableticeableceable 

はあなたの助けをいただき、ありがとうございます。

+0

'char input [] [200];'、コンパイラは –

+0

に文句を言う必要があります。 – kar3154

+0

エラーのあるプログラムを実行した結果は無意味です。たとえば、あなたのケースでは、たくさんのガベージ出力がありますが、何かが起こった可能性があります。 –

答えて

0

変数の前の&は、変数のアドレスではなく、変数の値を参照していることを意味します。変数のアドレスが何であるかわからない場合:http://www.cquestions.com/2010/02/address-of-variable-in-c.html

char input[][200]は、char配列の配列です(char配列は文字列として低俗ですが、TYPEではありません)。

あなたの問題は、string[i]文字だけでなくstring[i]間(付属)とstring[strLength]な文字を追加している、あなたのstrcat使用についてです。

0

あなたの問題は、strcatのである:

あなたのコードでは、アドレスを渡し、したがって、あなたはそれ以降、その文字から文字列全体を取得しています。

strcat(outputs,&string[i]); 

さて、以下のように上記のコードを変更:

strcat(output,string[i]); 

あなたは所望の出力を得るでしょう。あなたの初期コードの問題は、あなたが個々の文字ではなくアドレスを渡していたことでした。 また、 "<"番号ではなく、 "< ="番号ではないようにforループを変更してください。 疑問がある場合は教えてください。

+0

私は&を取り出したときに、 "const char * '型のパラメータに' char 'を渡すポインタの変換に互換性のない整数があり、" – kar3154

+0

"というアドレスを取るとstrcatは文字列を付加するために使用されます。したがって、文字列に文字を追加する方法については、次のリンクを使用してください: http:// stackoverflow。com/questions/4834811/strcat-concat-a-char-on-a-string を試してみてください。 char temp [2]; temp [0] = string [i]; temp [1] = '\ 0'; strcat(outputs、temp); これはうまくいくでしょう:) –

0

なぜ&が必要なのですか? char input [] [200];これは基本的に文字列の配列ですか、それともまったく別のものですか?

&numberOfTimesは、変数numberOfTimesのアドレスをメモリに得る。あなたの場合は文字列ではありません。これは整数で、%dを文字列部分をフォーマットする際に書式設定でscanf("%d", numberOf times. In second case when you have scanf("%s", input[]), scanf is getting string since you specifeid%sと指定したためです。

char input [] [200];これは基本的に文字列の配列ですか、それともまったく別のものですか?

これは文字列の配列です。

最後に、あなたのstringManipulationは恐ろしいです。申し訳ありませんが、私は正直になる必要があります。

strcat(outputs,&string[i]); &は、実際には配列の文字のアドレスを取得しています。だから起こっているのは、strcat()がそのアドレスを取得し、string[]の '\ 0'に達するまで実行されます。 \0は文字列の最後に注意します。そしてこれは繰り返されています。帽子はなぜあなたがあなたを得るかです。

ここに私の解決策があります。

void stringManipulation(char string[200]){ 
    int strLength = strlen(string); 
    int number = strLength/2; 
    for(int i = 0; i <= number; i=i+2){ 
     *outputs++ = string[i]; // you are copying one character at the time 
    } 
} 

EDIT:

  • outputs、すなわち文字列へのポインタです: が粉々に*outputs++を破ることができます。
  • outputs++増分ポインタchar配列は、それは(一種の出力[J ++]のような)第
  • *outputs++メモリを読み取り、ポインタをよりインクリメントアレイ内の次の文字を指します。

outputs[i++]は、最初のメンバーへのポインタを読み取った後、iを追加してそのアドレスにジャンプしてからインクリメントします。

+0

私は++を理解していないので、*出力++ = string [i]となり、char変数をインクリメントしていますか? – kar3154

+0

いいえ*出力++はそれをインクリメントするよりもメモリを読み込みます、++はポインタをインクリメントします投稿を編集しました – GRC

関連する問題