2014-10-28 65 views
0

我只是從vc6 ++切換到vs2013,發現它們之間有很多不同之處。 喜歡使用scanf_s代替scanf函數,CMATH而不是文件math.h殘培? - > _getchVS2013存在一些問題

是否有我應該知道的

順便說一句任何其他主要的區別,這是什麼意思? 「錯誤C2668:‘戰俘’:曖昧通話超載」

這裏是我的代碼,它是一個簡單的加密程序

#include<stdio.h> 
#include<string.h> 
#include<conio.h> 
#include<math.h> 
int encode1(int d,int n); 
int encode2(int d,int n); 
int encode3(int d,int n); 
int decode1(int d,int n); 
int decode2(int d,int n); 
int decode3(int d,int n); 
int main(void) 
{ 
char ans, exit;//Used to exit the program 
puts("Program starts"); 
int d = 0, n, temp; 
char s; 
unsigned number; 
printf("Please choose one of the followings \n"); 
printf("1)Encrypting\t2)Decrypting(q to quit)\n"); 
scanf("%d",&number); 
while (number!= 1 && number != 'q'&& number != 2) 
{ 
    printf("Wrong choice, retry\n"); 
    number = getchar(); 
} 
if(number!='q') 
{ 
    printf("Please type in the digit of your password\n"); 
    scanf("%d", &n); 
    getchar(); 
} 
switch (number) 
{ 
case 1: temp = encode1(d, n); 
    printf("%d\n", temp); 
    break; 
case 2: temp = decode1(d, n); 
    printf("%d\n", temp); 
    break; 
default:break; 
} 
puts("Press any key to continue"); 
exit = _getch(); 
puts("Program ends"); 
return 0; 
} 
int encode1(int d, int n) 
{ 
int b, c[100], i, j, t, r, e[100]; 
puts("Please type in your password to generated the key(integers only)"); 
scanf("%d", &b); 
for (i = 0; i<n+1; i++) 
{ 
    c[i] = b % 8; 
    b = b/8; 
} 
for (i = 0; i<n+1; i++) 
{ 
    d = d * 10 + c[i]; 
} 
r = encode2(d,n); 
return r; 
} 
int encode2(int b, int n) 
{ 
int c[100], i, j, t, r, d = 0; 
for (i = 0; i<n+2; i++) 
{ 
    c[i] = b % 8; 
    b = b/8; 
} 
for (i = 0; i<n+2; i++) 
{ 
    d = d * 10 + c[i]; 
} 
r = encode3(d,n); 
return r; 
} 
int encode3(int b, int n) 
{ 
int c[100], i, j, t, r, d = 0; 
for (i = 0; i<n+3; i++) 
{ 
    c[i] = b % 8; 
    b = b/8; 
} 
for (i = 0; i<n+3; i++) 
{ 
    d = d * 10 + c[i]; 
} 
return d; 
} 
int decode1(int d, int n) 
{ 
puts("Type in the key to retrieve your password"); 
scanf("%d", &d); 
int a[100], t, x; 
int c[100], i, j, e[100], k, g, u = 0, r; 
for (i = 0, j = n+3; i<n+3, j>0; j--, i++) 
{ 
    k = pow(10, j); 
    e[i] = d/(k); 
} 
for (i = 0, j = n+2; j >= 0, i<n+3; i++, j--) 
{ 
    g = pow(10, j + 1); 
    k = pow(10, j); 
    c[i] = (d - e[i] * g)/k; 
} 
for (i = 0, j = n+2; i<n+3, j >= 0; i++, j--) 
{ 
    t = c[j]; 
    a[i] = t; 
} 
for (i = 0, j = n+2; i<n+3, j >= 0; i++, j--) 
{ 
    r = pow(8, j); 
    u += a[i] * r; 
} 
x = decode2(u,n); 
return x; 
} 
int decode2(int d, int n) 
{ 
int a[100], t; 
int c[100], i, j, e[100], k, g, u = 0, r, x; 
for (i = 0, j = n+2; i<n+2, j>0; j--, i++) 
{ 
    k = pow(10, j); 
    e[i] = d/(k); 
} 
for (i = 0, j = n+1; j >= 0, i<n+2; i++, j--) 
{ 
    g = pow(10, j + 1); 
    k = pow(10, j); 
    c[i] = (d - e[i] * g)/k; 
} 
for (i = 0, j = n+1; i<n+2, j >= 0; i++, j--) 
{ 
    t = c[j]; 
    a[i] = t; 
} 
for (i = 0, j = n+1; i<n+2, j >= 0; i++, j--) 
{ 
    r = pow(8, j); 
    u += a[i] * r; 
} 
x = decode3(u,n); 
return x; 
} 
int decode3(int d, int n) 
{ 
int a[100], t; 
int c[100], i, j, e[100], k, g, u = 0, r, x; 
for (i = 0, j = n+1; i<n+1, j>0; j--, i++) 
{ 
    k = pow(10, j); 
    e[i] = d/(k); 
} 
for (i = 0, j = n; j >= 0, i<n+1; i++, j--) 
{ 
    g = pow(10, j + 1); 
    k = pow(10, j); 
    c[i] = (d - e[i] * g)/k; 
} 
for (i = 0, j = n; i<n+1, j >= 0; i++, j--) 
{ 
    t = c[j]; 
    a[i] = t; 
} 
for (i = 0, j = n; i<n+1, j >= 0; i++, j--) 
{ 
    r = pow(8, j); 
    u += a[i] * r; 
} 
return u; 
} 
+1

VC6 ++?!!是的,你會遇到很多變化。如果有人有一個相當完整的名單,我會感到驚訝,但我認爲它不會受到傷害。錯誤信息告訴你'pow'有多個定義,你的調用不適合它們中的任何一個。 – 2014-10-28 00:53:00

+0

您仍然可以使用'scanf',關於它的警告可以忽略 – 2014-10-28 01:13:13

+0

「模糊調用重載」表明您使用的是C++編譯器而不是C語言。 – chux 2014-10-29 05:31:41

回答

1

你爲什麼不張貼爲您提供了錯誤的代碼?只是猜測,你有看起來像代碼的東西:

int a = 1; 
int b = 2; 
double result = pow(a, b); 

的問題是,無論傳遞給pow參數是int S,但在math.h沒有pow超載,將採取兩種int小號。 編譯器告訴你它有過載問題,因爲在這種情況下最好的可行函數並不是唯一的。

您可以通過第一個參數強制轉換爲合適的類型解決這一問題,比如double

double result = pow((double)a, b); 

一般更多,因爲有很多很多的變化,它應該是很好,如果你可以減少範圍您的問題..您是否也計劃轉換傳統的MFC代碼?

但是,發佈您的錯誤,我最近升級了一些舊的項目,所以我可以幫你。

0

將C11標準與您正在運行的Visual Studio版本進行比較,最有可能是C99。

是由C99帶來

最大變化如下:

◾Variable長度數組

◾Designated初始化

◾Type泛型數學庫

◾New數據類型:長長,_Complex ,_Bool

◾限制指針

◾Intermingled的變量聲明

◾Inline功能

◾One行註釋打頭的//

最大的變化在C11:

一組新的目標是更安全的標準功能取代傳統的不安全功能。 對於典型的C程序員,C11的最大變化是其標準化的多線程支持。

新的C11頭文件聲明瞭用於創建和管理線程,互斥鎖,條件變量和_Atomic類型限定符的函數。另一個新的頭文件聲明瞭用於不間斷對象訪問的設施。最後,C11引入了一個新的存儲類說明符_Thread_local(C++ 11的thread_local的C等價物)。一個聲明爲_Thread_local的變量不會被多個線程共享。相反,每個線程都得到一個唯一的副本。

信息拉離: http://blog.smartbear.com/codereviewer/c11-a-new-c-standard-aiming-at-safer-programming/

好讀,如果你有時間。