我的程序似乎运行得很好,它按预期运行,它接受命令行参数和"旋转";根据输入的命令行参数从提示中选择输入的字符串。然而,如果我在没有任何参数的情况下运行代码,比如:./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;
}