2016-09-22 25 views
0

有沒有人知道爲什麼在Visual Studio 2015中編譯程序會給出與Linux Ubuntu(這些都是錯誤的)不同的結果(這些都是我想要保留的結果)。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

注意,在你的windows終端,你可以點擊左上方的窗口屬性控件,選擇Edit-> Mark',然後你可以選擇窗口中的文本作爲文本複製。按下[Enter]鍵,然後複製粘貼到您的問題中的文本(縮進* 4-spaces *),而不是張貼屏幕截圖。 –

回答

0

讀數超過數組的末尾會調用C. 不確定的行爲一旦你的程序調用未定義行爲任何事情都有可能發生,或者什麼都沒有。這是簡單的未定義。正如aneesh正確指出的那樣,原因是由於array2中的12元素迭代,其中ony 7存在。這暴露了填充代碼「幻數」(如12)的一個主要原因是一個壞主意。

相反,你想要做的是正確定義常量任何指定的數量(如array1array2你在每個字符串中的字符的最大數量),然後計算以前沒有定義任何剩餘量的值。

sizeof運營商爲您提供確定array1array2中存在的元素數量的方法。例如:

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

在數組2 [],你只有7的元件。而你的循環計數是12.這意味着你正在索引array2 []。這會導致你的程序在不同的平臺上以不確定的方式運行。

相關問題