2014-10-28 60 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/

好读,如果你有时间。