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
.
想一想。
如果 i
从 0
开始,它永远不会大于 len
。
循环不会运行。
您打算循环至 运行 ,而 i
比 len
少 .
对于初学者来说,如果 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;
}
#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
.
想一想。
如果 i
从 0
开始,它永远不会大于 len
。
循环不会运行。
您打算循环至 运行 ,而 i
比 len
少 .
对于初学者来说,如果 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;
}