我试图运行以下代码:
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[]) {
/* code */
char senha [256];
if (argv[1] != NULL)
{
strcpy(senha, argv[1]);
}
char frase [256];
printf("Insira a frase: \n");
scanf("%s", frase);
int sizeS = (int)strlen(senha);
int sizeF = (int)strlen(frase);
char fraseout [sizeF+1];
int i;
int j;
for (i=0; i<=sizeF-1; i++)
{
if(j>=sizeS)
{
j=0;
}
int valF = (int)frase[i];
int valS = (int)senha[j];
valF = 32 + ((valF - 32) + (valS - 32)) % (128-32);
fraseout[i] = (char)valF;
j++;
}
fraseout[sizeF] = '\0';
printf("\"%s\" -> \"%s\"\n", frase, fraseout);
return 0;
}
当我尝试在我的Ubuntu 15.04上运行它时,它会编译并运行完美。当我尝试在OSX Yosemite上运行它时,它也可以编译并运行完美。但是,如果我在CS50 VM上编译并运行它,尽管编译运行正常,我在运行时会出现Segmentation Fault错误。为什么会发生这种情况,为什么只能在一个单一的操作系统上发生?
答案 0 :(得分:3)
当j具有初始值0时,代码起作用。但是,不应在所有(或任何)系统上假设,因此行为不同。初始化j。
答案 1 :(得分:2)
可能的问题,删除了不相关的行。未初始化的可能是你的问题。
argv[1] != NULL
对C89是安全的,但是不明确,可能不适用于不合规的编译器。检查argc
更为典型。
senha
未初始化,这可能会导致缓冲区溢出。
char senha [256];
if (argv[1] != NULL)
strcpy(senha, argv[1]);
不检查缓冲区的大小以进行输入,请使用scanf("%255s", frase);
不检查scanf
的返回值,frase
如果失败将保持未初始化状态,这可能会导致缓冲区溢出。
char frase [256];
scanf("%s", frase);
VGA不在C89中,但在C99中并作为GNU C89的扩展提供,这是gcc默认使用的。这可能无法使用严格的C89编译器进行编译。
int sizeF = (int)strlen(frase);
char fraseout [sizeF+1];
未初始化。
int j;
此计算可能会产生"
,导致输出报价不正确。
valF = 32 + ((valF - 32) + (valS - 32)) % (128-32);
fraseout[i] = (char)valF;
printf("\"%s\" -> \"%s\"\n", frase, fraseout);