#c #if-statement #while-loop #cs50 #caesar-cipher
Вопрос:
Проверьте, не предоставляет ли пользователь аргументов командной строки или более, он печатает ключ Usage: ./caesar. Если аргумент командной строки один, то он проверяет, являются ли все символы в строке цифрами. Если я введу ./caesar в командной строке, я получу ошибку ошибки сегментации. Этого не происходит, когда «ЕСЛИ» находится перед «ПОКА». Я не уверен, почему возникает эта ошибка. Действительно ценю любую помощь!
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<cs50.h>
int main(int argc, char*argv[])
{
string str = argv[1];
//check if argv[1] are all digits
while(argc == 2)
{
for(int i = 0; i< strlen(str); i )
{
if(!isdigit(str[i]))
{
printf("Usage: ./caesar key n");
break;
}
}
break;
}
// check if argument count is not 2
if(argc != 2)
{
printf("Usage: ./caesar key n");
}
return 0;
}
Комментарии:
1.
if(argc != 2)
это должно быть первым делом в вашей программе, преждеstring str = argv[1];
чем, и вы должны просто вернуться, если это неправильно. Как только вы это сделаете, в этомwhile(argc == 2)
нет необходимости, потому что вы уже проверили, и это не изменится, если вы не измените это сами.2. Примечание: Не злоупотребляйте
while(...) { ....; break;}
какif
утверждение. Это не конкурс запутанного кода на языке си. Этоif
утверждение существует не просто так.3. Я узнал, почему мой код пошел не так. Если мой аргумент командной строки был ./caesar, то argc = 1 и argv[0] = ./caesar, но компилятор понятия не имеет, что такое argcv[1], так как количество моих аргументов равно единице, и инициализация argv[1] в строку приводит к ошибке сегментации (где я пытался получить доступ к памяти, которой не существовало). Спасибо, ребята, что обратились!
Ответ №1:
./casear
argv[0]
значение string str = argv[1];
is равно нулю, что приводит к ошибке seg.
Комментарии:
1. Первое было причиной из-за доступа к нулевому указателю, если эта часть исправлена, программа выполняется без ошибок.