标签: cs50

使用cs.50.h中的`string`分割C代码中的错误

我在这里有一个程序,我正在尝试使用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 segmentation-fault caesar-cipher cs50

2
推荐指数
1
解决办法
371
查看次数

当给定值并减去零时,无限循环在C中

我刚刚开始学习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)

c while-loop cs50

2
推荐指数
1
解决办法
483
查看次数

为什么我的while循环即使在值为true时也会继续执行?

我最初尝试使用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重新分配值.

c scope loops while-loop cs50

2
推荐指数
1
解决办法
165
查看次数

为什么模运算符不在C中的printf函数内工作?

当我删除"%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".请解释.

c function cs50

2
推荐指数
1
解决办法
422
查看次数

C - 超出类型字符串的范围

我试图解决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 cs50

2
推荐指数
1
解决办法
390
查看次数

检查命令行输入是否为数字

我是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)

虽然上面的代码没有抛出错误,但它没有正确验证输入,我无法弄清楚原因.有人能指出我正确的方向吗?

非常感谢提前和所有最好的

c cs50

2
推荐指数
1
解决办法
182
查看次数

为什么这个 SQL 查询不起作用?CS50 Pset7 - 电影

我目前正在通过这个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 的计数......

谁能看出为什么会这样?

sql sqlite cs50

2
推荐指数
1
解决办法
7089
查看次数

“***堆栈粉碎检测到***”文件读写

我正在使用一个 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 pointers file cs50

2
推荐指数
1
解决办法
105
查看次数

在 C 中读取命令行参数并检查它是否为数字

关于我的目标的详细信息

在 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 arrays command-line-arguments cs50

2
推荐指数
1
解决办法
101
查看次数

我的程序在调试时运行正常,但在调试时运行不正确

我目前正在用 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)

c debugging caesar-cipher cs50

2
推荐指数
1
解决办法
114
查看次数