https://cs50.harvard.edu/x/2023/psets/2/substitution/
Substitution - CS50x 2023
Harvard University's introduction to the intellectual enterprises of computer science and the art of programming.
cs50.harvard.edu
하...
3시간째 작성중인데
하나씩 구현은 되는데
이젠 띄어쓰기를 인식을 못한다.ㅠㅠ
아래는 지금까지 작성한 코드
#include <cs50.h>
#include <stdio.h>
#include <string.h>
string substitution(string text, int length, string key);
int main(int argc, string argv[])
{
//값 받아오기
if (argc != 2)
{
printf("Usage: ./substitution KEY\n");
};
string key = argv[1];
int key_length = strlen(key);
string input_text; //if 조건 내부에서 선언하면 밑에서 못써서 올려둠
int text_length; //if 조건 내부에서 선언하면 밑에서 못써서 올려둠
//값 검사
for (int i = 0; i < key_length; i++) //키 대문자로 변환
{
int key_letter = key[i];
if(key_letter > 96 && key_letter < 123)
{
key[i] = key[i - 32];
};
};
if (key_length == 26) //26글자가 맞는지
{
bool not_alphabet = false;
for (int i = 0; i < key_length; i++)
{
if (key[i] < 65 || key[i] > 90) // 알파벳 대문자인지
{
not_alphabet = true;
};
};
if (not_alphabet == false)
{
bool is_repeated = false;
for (int i = 0; i < key_length; i++) //첫자리가 나머지랑 같은지
{
for (int j = i + 1; j < key_length; j++) //+1임에 주의
{
if (key[i] == key[j])
{
is_repeated = true;
};
};
};
if (is_repeated == false)
{
input_text = get_string("plaintext: "); //텍스트 받아오기
text_length = strlen(input_text);
}
else
{
printf("KET값은 중복되면 안됩니다.\n");
return 1;
};
}
else
{
printf("KEY값은 알파벳이어야 합니다.\n");
return 1;
};
}
else
{
printf("Key값 길이는 26글자여야 합니다.\n");
return 1;
};
string result = substitution(input_text, text_length, key); //암호화
printf("ciphertext: %s\n", result); //결과 출력
};
string substitution(string text, int length, string key) //암호화
{
string result = text;
for (int i = 0; i < length; i++)
{
int letter = text[i]; // 변수를 바꿔서 다시 내보내야 하므로 복붙용 선언
if (letter > 64 && letter < 91) //대문자
{
letter = key[letter - 65];
}
else if (letter > 96 && letter < 123) //소문자
{
letter = key[letter - 97] + 32; //[i + 32] 아님에 주의
}
else
{
letter = text[i];
}
result[i] = letter;
};
return result;
};
해결됨. 아래는 최종 코드
모든 기능은 정상작동 하지만, 왜 그런건지 의문이 많이 남아서, 분석을 해보아야할것 같다.
#include <cs50.h>
#include <stdio.h>
#include <string.h>
string substitution(string text, int length, string key);
int main(int argc, string argv[]) //string 은 char*과 완전히 동일함
{
//값 받아오기
if (argc == 1) //수정은 했는데.. 왜 여기에 (argc != 2)가 들어가면 안되는거지??
{
printf("Usage: ./substitution KEY\n");
return 1;
}
else if (argc > 2)
{
printf("Usage: ./substitution KEY\n");
return 1;
};
string key = argv[1];
int key_length = strlen(key);
string input_text; //if 조건 내부에서 선언하면 밑에서 못써서 올려둠
int text_length; //if 조건 내부에서 선언하면 밑에서 못써서 올려둠
// //이 부분을 안으로 옮기니 띄어쓰기 문제 해결됨.
// for (int i = 0; i < key_length; i++) //키 대문자로 변환
// {
// int key_letter = key[i];
// if(key_letter > 96 && key_letter < 123)
// {
// key[i] = key[i] - 32; //[i-32]아님에 주의
// };
// };
if (key_length == 26) //26글자가 맞는지
{
bool not_alphabet = false;
for (int i = 0; i < key_length; i++)
{
if (key[i] < 65 || (key[i] > 90 && key[i] < 97) || key[i] > 122) // 알파벳 대문자인지
{
not_alphabet = true;
}
else if (key[i] > 96 && key[i] < 123)
{
key[i] = key[i] - 32;
};
};
if (not_alphabet == false)
{
bool is_repeated = false;
for (int i = 0; i < key_length; i++) //첫자리가 나머지랑 같은지
{
for (int j = i + 1; j < key_length; j++) //+1임에 주의
{
if (key[i] == key[j])
{
is_repeated = true;
};
};
};
if (is_repeated == false)
{
input_text = get_string("plaintext: "); //텍스트 받아오기
text_length = strlen(input_text);
}
else
{
printf("KET값은 중복되면 안됩니다.\n");
return 1;
};
}
else
{
printf("KEY값은 알파벳이어야 합니다.\n");
return 1;
};
}
else
{
printf("Key값 길이는 26글자여야 합니다.\n");
return 1;
};
string result = substitution(input_text, text_length, key); //암호화
printf("ciphertext: %s\n", result); //결과 출력
};
string substitution(string text, int length, string key) //암호화
{
string result = text;
for (int i = 0; i < length; i++)
{
int letter = text[i]; // 변수를 바꿔서 다시 내보내야 하므로 복붙용 선언
if (letter > 64 && letter < 91) //대문자
{
letter = key[letter - 65];
}
else if (letter > 96 && letter < 123) //소문자
{
letter = key[letter - 97] + 32; //[i + 32] 아님에 주의
}
else
{
letter = text[i];
}
result[i] = letter;
};
return result;
};
//for loop(가져온텍스트 길이만큼)
//int letter = text[i]
//if (letter > 64 && letter < 91) 대문자인 경우
// letter = key[i]
//else if (letter > 96 && letter < 123)
// letter = key[i+32]
// 숫자와 다른 기호들 놔두기
//loop에서 나와서 return text;