なぜ動作しないのか分かりません。 3つ以上のargsがあるときには腹を立てますが、1つのVigenere argだけがあるときには腹を立てません。私は同じ問題を抱えていた他の人たちを見てきました。 ./vigenere
を実行すると、セグメント化エラーが発生します。それは./vigenere bard
のように2つの引数で正常に動作し、余分な引数が./vigenere bard dfads
のように与えられたときに不平を言います。Vigenere cs50は2番目の引数が不足していると文句を言わない
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main(int argc,string argv[])
{
string sKeyWord = argv[1];
int iKeyLength = strlen(sKeyWord);
int iKey[iKeyLength];
string sPlainText = "";
int counter = 0;
int iAccept = 0;
do
{
if(argc != 2) // <-----this should work whats wrong?
{
printf("Invalid argument! Please enter program name and keyword.\n");
return 1;
}
else if(argv[1])
{
for(int i = 0; i < iKeyLength; i++)
{
if (!isalpha(argv[1][i]))
{
printf("Invalid entry, please use letters only.\n");
return 1;
}
else
{
iAccept = 1;
}
}
}
}while(iAccept == 0);
for(int i = 0; i < iKeyLength; i++)
{
iKey[i] = toupper(sKeyWord[i]) - 65;
}
sPlainText = GetString();
int iPlainText = strlen(sPlainText);
for(int j = 0; j < iPlainText; j++)
{
if(!isalpha(sPlainText[j]))
{
printf("%c",sPlainText[j]);
counter++;
}
if(islower(sPlainText[j]))
{
printf("%c",((((sPlainText[j] - 97) + iKey[(j - counter)%iKeyLength])%26)+ 97));
}
if(isupper(sPlainText[j]))
{
printf("%c",((((sPlainText[j] - 65) + iKey[(j - counter)%iKeyLength])%26)+ 65));
}
}
printf("\n");
return 0;
}
より早く調査する必要があります。例えば、文字列の前にsKeyWord = argv [1]; ' – BLUEPIXY
DOH!ありがとうbluepixy *ハイファイブ*私の救世主!文字列skeyWord = ""に変更されました。 do whileループの最後にargv [1]を割り当てます。 – Firecore
なぜdo-whileループの引数をチェックしていますか? (ヒント:私はあなたがこのコードをループに入れる必要はないと思う) –