for循环not 运行 in c语言cs50 ide

For loop not running in c language cs50 ide

#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>

string crypt(string msg, int key);

int main(int argc, string argv[])
{
    if (argc != 2)
    {
        printf("Sorry\n");
        return 1;
    }
    else
    {
        string h = get_string("ipt: ");
        h = crypt(h, atoi(argv[2]));
    }
}

string crypt(string msg, int key)
{
    string c = "";
    printf("%s\n", msg);
    int len = strlen(msg);
    for(int i = 0; i > len; i++)
    {
        char t = (msg[i] + key) % 26;
        printf("%c", t);
    }
    return c;
}

在此代码中显示 Segmentation Fault

我不明白这个问题

我尝试了很多但还是不明白我不是在尝试访问内存 “那不属于我” 正如维基所说:-

Core Dump/Segmentation fault is a specific kind of error caused by accessing memory that “does not belong to you.”

我在 MS Edge 上使用 cs50 ide

此代码应该输出 input: 文本的编码版本。

请帮助我不明白这个问题。

输入文字后出现错误

for(int i = 0; i > len; i++)

这表示循环从 0 处的 i 开始,并且只有在 i 更大 时才会继续 ] 比 len.

想一想。
如果 i0 开始,它永远不会大于 len

循环不会运行。

您打算循环至 运行 ,而 ilen .

对于初学者来说,如果 argc 等于 2,则 argv[2] 等于 NULL。也就是说根据 C 标准 argv[argc] 等于 NULL.

所以你需要改变这个说法

h = crypt(h, atoi(argv[2]));
                  ^^^^^^^

h = crypt(h, atoi(argv[1]));
                  ^^^^^^^

这就是段错误的原因。

来自 C 标准(5.1.2.2.1 程序启动)

2 If they are declared, the parameters to the main function shall obey the following constraints:

— The value of argc shall be nonnegative.

— argv[argc] shall be a null pointer.

而且你的意思似乎是for循环中的以下条件

for(int i = 0; i < len; i++)
               ^^^^^^^

而不是

for(int i = 0; i > len; i++)
               ^^^^^^^

另外,最好使用 size_t 类型而不是 int 类型。它是由函数strlen编辑的值return的类型。

size_t len = strlen(msg);
for( size_t i = 0; i < len; i++)
//...

注意在函数中你没有改变原始字符串。你只是在输出它转换后的字符。

在这种情况下,该函数没有多大意义,因为它似乎应该 return 将转换后的字符串传递给调用者。

并且函数 return 指向空字符串的指针

string c = "";
//...
return c;

没有意义。

该函数至少应按以下方式定义。

string crypt( string msg, int key )
{
    printf("%s\n", msg);
    
    size_t len = strlen( msg );
    for ( size_t i = 0; i < len; i++ )
    {
        msg[i] = (msg[i] + key) % 26;
        printf("%c", msg[i] );
    }

    return msg;
}