我在这里有一个程序,我正在尝试使用ceasar密码解码一串字母; 本质上我将字符串中的每个字符"向下"移动一个字母("a" - >"b","f" - >"g","z" - >"a").
我移动一封信的数量取决于我给它的关键.
在这个特定的程序中,我有一个秘密编码的消息硬编码到main()函数中,一个for循环遍历每个可能的密钥.
这个想法是,如果这个秘密信息只是向下移动了x个字母,吐出25个版本的密码将揭示一个可理解的答案.
不幸的是,我正在使用一些对我来说很新的概念 - argc,argv和一个程序中的多个函数.我对此很新.
有人可以帮我解释我得到的分段错误错误吗?我认为我没有引起任何参数溢出.
#include <stdio.h>
#include <cs50.h>
#include <string.h>
string decode(int key, string message);
int main(void)
{
string secret_message = "ueuag rKJ AGIQ GIAR FEgN";
for (int i = 0; i < 25; i++)
{
decode(i, secret_message);
printf("%s", secret_message);
}
return 0;
}
string decode(int key, string message)
{
int i;
for (i = 0; i < strlen(message); i++)
{
if (message[i] >= 'a' && message[i] <= 'z') …
Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习C.我正在编写一个程序,以季度,镍币,硬币和便士的形式给客户带来变化.出于某种原因,当while
循环达到0时,它不会中断.
编辑:这个问题非常类似于已经在SO上的另一个问题(浮动点数学是否被打破?).我会为那些寻找有关while循环的答案的人保留这个问题,就像我自己一样,他不知道浮点数是否会导致无限循环.
#include <stdio.h>
#include <cs50.h>
int main(void){
float val;
int quarters = 0;
int dimes = 0;
int nickels = 0;
int pennies = 0;
printf("How much change is due?: \n");
val = GetFloat();
while (val > 0){
if (val >= 0.25){
quarters += 1;
val -= 0.25;
}
else if (val >= 0.1) {
dimes += 1;
val -= 0.1;
}
else if (val >= 0.05){
nickels += 1;
val -= 0.05;
} …
Run Code Online (Sandbox Code Playgroud) 我最初尝试使用Do While循环但是与while循环具有相同的结果.用户必须输入数字28-31.在第一次尝试时,如果用户正确输入值,它将转到代码的下一部分.但是,如果用户输入的值不正确,它将再次询问一个号码,但无论他们输入什么,它都会不断重复.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
printf("Days in month: ");
int daysInMonth = GetInt();
while (daysInMonth < 28 || daysInMonth > 31)
{
printf("Days in month: ");
int daysInMonth = GetInt();
printf("%i\n", daysInMonth);
}
printf("Pennies on the first day: ");
int pennies = GetInt();
while (pennies < 1)
{
printf("Pennies on the first day: ");
int pennies = GetInt();
}
}
Run Code Online (Sandbox Code Playgroud)
printf语句用于调试目的,以测试是否daysInMonth
重新分配值.
当我删除"%97"然后代码工作并打印它所期望的.就像输入是"a"一样,它打印"f",而当模数97存在并打印空格时,它不起作用.
这个问题背后的原因是什么?怎么解决?
int main(void)
{
char *s = get_string();
for(int i = 0; i<strlen(s); i++)
printf("this is %c", (s[i]+5%97));
}
Run Code Online (Sandbox Code Playgroud)
编辑:添加括号后的人,即将我的最后一行更改为"(s [i] +5)%97"程序未按预期工作.输入"a"时输出应为"f",但它是空格.
进入"A"后,我得到"F"!! 发生了什么?该程序旨在将"a"转换为"a + 5",但它将"A"转换为"A + 5".请解释.
我试图解决CS50的一些问题集.我需要提取字符串"stra"的前两个字符,然后连接它们并转换为字符串,然后将该字符串与数组中的字符串进行比较.我已经读到很多,在C中没有字符串,只有字符数组,但在CS50中它们使用字符串声明类型.当我运行代码时,它给了我下面的错误
运行时错误:索引4超出类型'string [4]'的范围
#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(void){
string stra = "GH7";
int x = 0;
//extract first two chars of stra
char strb[3] = {stra[0], stra[1], '\0'};
//concatenate chars
string strc = strb;
string letters[] = {"AB","CD","ED","GH"};
for (int i = 0, n = sizeof(letters); i < n; i++)
{
if (strc == letters[i]) // <--the error happens here
{
break;
}
else
{
x++;
}
}
printf("%i", x);
}
Run Code Online (Sandbox Code Playgroud)
它给了我这个错误
运行时错误:索引4超出类型'string [4]'的范围
我是C的新手,想要编写一个简单的程序,用两个命令行参数调用(第一个是程序的名称,第二个是字符串).我已经验证了参数的数量,现在想验证输入只包含数字.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <cs50.h>
int main(int argc, string argv[])
{
if (argc == 2)
{
for (int i = 0, n = strlen(argv[1]); i < n; i++)
{
if isdigit(argv[1][i])
{
printf("Success!\n");
}
else
{
printf("Error. Second argument can be numbers only\n");
return 1;
}
}
else
{
printf("Error. Second argument can be numbers only\n");
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
虽然上面的代码没有抛出错误,但它没有正确验证输入,我无法弄清楚原因.有人能指出我正确的方向吗?
非常感谢提前和所有最好的
我目前正在通过这个https://cs50.harvard.edu/x/2020/psets/7/movies/ 并尝试完成 9.sql。
有一个名为“电影”的数据库,其中包含表:电影(列:id、标题、年份)、人物(id、姓名、出生)和明星(movie_id、person_id)。
任务是:
编写一个 SQL 查询来列出所有出演 2004 年上映的电影的人的名字,按出生年份排序。它应该返回 18,013 个名字。
到目前为止,这就是我所做的:
SELECT count(distinct name)
from people
join stars on stars.person_id = people.id
join movies on stars.movie_id = movies.id
WHERE year = 2004;
Run Code Online (Sandbox Code Playgroud)
但是,这仅返回 17,965 的计数......
谁能看出为什么会这样?
我正在使用一个 C 程序,该程序从单个文件中读取并用于sprintf
将该数据写入多个文件,我在某处出错了,但我真的不知道哪里会导致此错误:
*** stack smashing detected ***
这里给出了可用于复制的代码:
FILE * source=fopen("card.raw","r");// defines source I will read from
char array[512];
int active_read=0;
char * filename;
sprintf(filename, "%03i.jpg",i);
FILE *image=fopen(filename, "a"); //my understanding of sprintf to create a file
while(fread(array,sizeof(char *),512,source)==512) // if 512 characters can be detected
{
if(array[0]==0xff && array[1]==0xd8 && array[2]==0xff && (array[3] & 0xf0==0))
{
if(active_read==1)
fclose(image);
active_read=1;
sprintf(filename, "%03i.jpg",i);
image=fopen(filename, "a");
fwrite(array, sizeof(char *),512, image);
i++;
}
else if(active_read==1)
fwrite(array, sizeof(char *), 512, image); …
Run Code Online (Sandbox Code Playgroud) 关于我的目标的详细信息
在 C 中,我的程序应该从命令行获取输入,读取它,确保它是一个数字,然后打印出“成功”如果为真,“用法:./凯撒密钥”如果为假。
预期成绩
./caesar 33
Success
Run Code Online (Sandbox Code Playgroud)
或者
./caesar zzz
Usage: ./caesar key
Run Code Online (Sandbox Code Playgroud)
实际结果
./caesar 33
Segmentation error
Run Code Online (Sandbox Code Playgroud)
我试过的
int main (int argc, string argv[])
{
if (argc == 2)
{
if (isdigit(argv[1]))
{
printf("Success\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
或者
if (argc == 2)
{
if (isdigit(argv[0][1]))
{
printf("Success\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
或者
int main (int argc, string argv[])
{
if (argc == 2 && isdigit(argv[1]))
{
printf("Success\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我目前正在用 C 编写一个简单的程序,该程序从用户那里获取一个命令行参数,该参数是一个替换密码密钥。目前,我的程序正在检查用户可能输入的所有可能不正确的参数。
无论输入是什么,通过调试器运行它都会使我的程序每次都完美运行。但是,在没有调试器的情况下运行我的程序,同时使参数至少有一个小写字母(例如 ./substitution VCHPRZGJNTLSKFBDQWAXEuymoi),会导致“sum”变量在大约 50% 的情况下具有不正确的值。
我将快速解释“sum”变量的用途,以便更容易理解。'sum' 从 2015 年开始,因为这是根据 ASCII 表将所有 26 个大写字母相加的值。我的函数中的 for 循环然后从 2015 中减去密码密钥中的每个字符。最后,最后一个 if 语句检查 sum = 0,这意味着只输入了唯一字符。
在没有调试器的情况下运行它时,'sum' 有时是 0,有时是 -32 * 小写字母的数量。例如,VCHPRZGJNTLSKFBDQWAXEuymoi 有 4 个小写字母,'sum' 有时为 0,有时为 -128。
我不知道这个问题是从哪里来的,我将不胜感激任何帮助。
这是我的代码:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
string sub(string plaintext,string cipher);
int main(int argc, string argv[])
{
string cipher = argv[1];
// checks for whether an argument was provided
if (argc != 2)
{
printf("Usage: ./substitution KEY\n");
return 1;
}
// checks …
Run Code Online (Sandbox Code Playgroud)