2016-09-22 9 views
0

Visual Studio 2015でプログラムをコンパイルするのがなぜ異なるのか分からないのですが、それはLinuxのUbuntuとは違います。 []、あなたが唯一の7つの要素を持つ配列2でDiifferetnの結果がLinuxとVisual Studio

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

int main() { 
    int i,j,k; 
    int pair = 0; 
    char array1[][12] = { "strike", "march", "play", "cool", "may", "july", 
          "school", "bad", "good", "linux", "really" , "weird"}; 
    char word[12]; 
    char array2[][12] = { "really", "mount", "hike", "bad", "linux", "weird","define"}; 
    for (i = 0; i < 12; i++) { 
     for (j = 0; j < 12; j++) { 
      if (strcmp(array1[i], array2[j])==0) { 
       strcpy(word, array1[i]); 
       for (k = 0; word[k]!='\0'; k++) { 
        word[k] = toupper(word[k]); 
       } 
       printf("%s\n", word); 
       pair++; 
      }   
     }  
    } 
    printf("\nTotal pairs: %d", pair); 
    getchar(); 
    return 0; 
} 

enter image description here

+0

注意、ウィンドウ左上のウィンドウプロパティコントロールをクリックし、 'Edit-> Mark'を選択すると、テキストとしてコピーするウィンドウ内のテキストを選択できます。 '[Enter]'を押すと、ここにあなたの質問に貼り付けることができるテキストがコピーされます(* 4-space *でインデントされます)。 –

答えて

0

はC.に未定義の動作を呼び出します。単純に定義されていません。 aneeshが正しく注記するように、理由は12要素をarray2のどこかで繰り返すことによるものです。ここでは、ony 7が存在します。これは、あなたのコードに「マジックナンバー」(12など)を埋め込む主な理由の1つが悪い考えです。

代わりに、何がやりたいことは、適切に(例えばarray1array2の各文字列の文字のあなたの最大数など)が指定された量のために定数を定義し、事前に定義されていない残りの量の値を計算しています。

sizeofオペレータは、array1およびarray2に存在する要素の数を判断する方法を提供します。例えば:

a1elem = sizeof array1/sizeof *array1; /* get number of */ 
a2elem = sizeof array2/sizeof *array2; /* elements in each */ 

for (i = 0; i < a1elem; i++) {  /* loop over valid range */ 
    for (j = 0; j < a2elem; j++) { /* for array1 & array2 */ 

注:sizeofオペレータのみ宣言が存在する範囲内で可視であるsizeof配列を決定するために使用することができる)たとえば、配列を渡す場合できませんsizeofを使用して、関数内の配列サイズを決定します。一緒に作品を置く

、次のような何かをして、それは関係なく、オペレーティングシステムの正しく動作可能性があり:あなたの中

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

enum { MAXL = 12 }; 

int main (void) { 
    int a1elem, a2elem, i, j, k, pair = 0; 
    char array1[][MAXL] = { "strike", "march", "play", "cool", 
          "may", "july", "school", "bad", 
          "good", "linux", "really" , "weird"}, 
     array2[][MAXL] = { "really", "mount", "hike", 
          "bad", "linux", "weird","define"}, 
     word[MAXL] = ""; 

    a1elem = sizeof array1/sizeof *array1; /* get number of */ 
    a2elem = sizeof array2/sizeof *array2; /* elements in each */ 

    for (i = 0; i < a1elem; i++)   /* loop over valid range */ 
     for (j = 0; j < a2elem; j++)  /* for array1 & array2 */ 
      if (strcmp (array1[i], array2[j])==0) { 
       strcpy (word, array1[i]); 
       for (k = 0; word[k]; k++) 
        word[k] = toupper (word[k]); 
       printf ("%s\n", word); 
       pair++; 
      }   

    printf ("\nTotal pairs: %d\n", pair); 
#if defined(_WIN32) || defined(_WIN64) 
    getchar(); 
#endif 
    return 0; 
} 

使用例/出力

$ uname -snrmo 
Linux valkyrie 4.7.4-1-ARCH x86_64 GNU/Linux 

$ ./bin/arraysz 
BAD 
LINUX 
REALLY 
WEIRD 

Total pairs: 4 
1

。そしてあなたのループカウントは12です。つまり、あなたはarray2 []へのインデックスを作成しています。これにより、プログラムはさまざまなプラットフォームで不定に動作します。あなたのプログラムが何も起こらないか、まったく何もすることができます未定義の動作を呼び出したら、配列の終わりを超えて読み取る

関連する問題