与VS2013有一些问题

时间:2014-10-28 00:46:59

标签: c visual-studio-2013 vc6

我只是从vc6 ++切换到vs2013,并发现它们之间存在很多差异。 就像使用scanf_s而不是scanf一样,cmath而不是math.h getch - > _getch

我应该注意哪些其他主要区别?

顺便说一句,这是什么意思? "错误C2668:' pow' :模糊调用超载"

这是我的代码,它是一个简单的加密程序

#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;
}

2 个答案:

答案 0 :(得分:1)

为什么不发布导致该错误的代码?只是猜测,你在代码中有一些看起来像:

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

问题是传递给pow的两个参数都是int s,但powmath.h的重载不会超过int double }}秒。 编译器告诉你它在重载时遇到了麻烦,因为在这种情况下,最好的可行功能并不是唯一的。

您可以通过将第一个参数转换为合适的类型来解决此问题,例如double result = pow((double)a, b);

{{1}}

更一般地说,由于有很多变化,如果你可以减少问题的范围应该很好。你是否还计划转换传统的MFC代码?

然而,发布您的错误后,我最近升级了几个旧项目,所以我可以帮助您。

答案 1 :(得分:0)

将C11标准与您运行的Visual Studio版本进行比较,很可能是C99。

C99带来的最大变化如下:

◾可变长度数组

◾指定的初始化程序

◾Type-generic数学库

◾新数据类型:long long,_Complex,_Bool

◾严格指针

◾变量的变量声明

◾内联功能

◾以//

开头的一行注释

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/

如果你有时间,请阅读。