c语言 - CS50 - 问题集 2 - 遇到"segmentation fault (core dumped)"



我的程序似乎运行得很好,它按预期运行,它接受命令行参数和"旋转";根据输入的命令行参数从提示中选择输入的字符串。然而,如果我在没有任何参数的情况下运行代码,比如:./caesar,它不起作用,它会说"分段故障(堆芯倾倒(";但如果我像这个./caesar 1或任何其他数字一样运行它,它就会按预期工作。

#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int only_digits(string n);
char rotate(char i, int n);
int main(int argc, string argv[])
{

if(only_digits(argv[1]) && argc == 2) {
string plaintext = get_string("plaintext:  ");
printf("ciphertext: ");
int k = atoi(argv[1]);  // converts string n to k
for (int i = 0, l = strlen(plaintext); i < l; i++)
{
printf("%c", rotate(plaintext[i], k));
}
printf("n");
}
else
{
printf("Usage: ./caesar keyn");
return 1;
}
}

int only_digits(string n) // function that returns 1 or 0 depending if given string is only digits
{
int state;
for(int i = 0, l = strlen(n); i < l; i++)
{
if (isdigit(n[i]))  // checks if characters in string is a digit from 1 to 9
{
state = 1;
}
else
{
state = 0;
break;
}
}
return state;
}
char rotate(char c, int n)
{
char rotated_char = c;
if (isupper(c))
{
int a_index = c - 'A';
int c_cipher = (a_index + n) % 26;
rotated_char = c_cipher + 'A';
}
else if (islower(c))
{
int a_index = c - 'a';
int c_cipher = (a_index + n) % 26;
rotated_char = c_cipher + 'a';
}
return rotated_char;
}```

最快、最简单的修复方法是替换:

if(only_digits(argv[1]) && argc == 2)

带有:

if(argc == 2 && only_digits(argv[1]))

只要把这两个子表达式互换一下。当argc为1(即没有参数(时,argv[1]NULL,而only_digits()无法处理该问题—strlen(NULL)不正确。

然而,如果我们先做argc == 2,短路评估规则说,由于FALSE && anything总是FALSE,我们不需要麻烦评估only_digits(),因此永远不会调用代码,从而避免了崩溃。

您已经得到了两个不错的答案。

我的建议是同时考虑用户和那些将修改代码的程序员。通知用户命令行问题,不要在底部"隐藏"失败"过程。。。如果处理要停止,请在顶部显示(您也可以保存一级缩进!(

int main( int argc, string argv[] )
{
if( argc != 2 )
{
printf("Usage: ./caesar key [where key is all numeric]n");
return 1;
}
if( !only_digits( argv[1] ) )
{
printf( "Key must be an integer valuen");
return 1;
}
int k = atoi( argv[1] );  // converts string n to k
string plaintext = get_string( "plaintext:  " );
printf( "ciphertext: " );
for( int i = 0, l = strlen( plaintext ); i < l; i++ )
{
printf( "%c", rotate( plaintext[i], k ) );
}
printf("n");
return 0;
}

相关内容

  • 没有找到相关文章

最新更新