2017-11-03 14 views
0

이 코드의 목적은 프로그램에 전달 된 파일을 가져 와서 파일의 각 문자의 문자 빈도를 생성하는 것입니다. 위의 코드에서 구두점을 제거하고 소문자로 변환합니다.코드가 실행되는 동안 계속 "버스 오류"가 표시됩니까?

#include<iostream> 
#include<string> 
#include<fstream> 

using namespace std; 

int main() 
{ 
    string fileContent = "qr rqh zrxog kdyh eholhyhg lq wkh odvw bhduv ri wkh qlqhwhhqwk fhqwxub wkdw wklv"; 

    int count[26] = { 0 }; // an array the size of the alphabet. 

    for(int f = 0; f < fileContent.length(); f++) // run til the file end. 
    { 
      if(fileContent[f] == 32) // to take care of the spaces. 
      { 
        f++; // also tried "continue;" and yeild different and also incorrect results. 
      } 

      if(fileContent[f] >= 48 && fileContent[f] <= 57) //take care of numbers. 
      { 
        f++; // tried "continue;" 
      } 

      count[fileContent[f]]++; 

    } 

    for(int p = 0; p < 26; p++) 
    { 
      cout << char(p + 97) << ": " << count[p] << endl; 
    } 
return 0; 
} 

이 코드를 실행하면 좀 정확한 주파수를 얻을 수 있으며, 일부 끔찍하게 잘못된 것들 (다른 모든 결과가 잘못된 것 같아, 아직 몇 글자 후에는 천문학적으로 큰 숫자로 떨어져 산책로). 더 나은 방법이 있나요? 이 코드의 문제점은 무엇입니까? 요청에 따라 (분명히 충분히 명확하지 않았으므로) 더 많은 코드 (무작위로 100 개의 문자열 포함)를 추가했습니다.

자세한 내용은이 프로그램이 Ceasar 시프트 디코더 용입니다. 에. 나는 기본 C++에 있고, 당신으로부터 더 많은 경험 많은 개발자 조언을 크게 감사 할 것입니다. 고맙습니다! 프로그램에서

+2

*이 코드에 어떤 문제가 있습니까? * - 조언 - 학습해야 할 사항 중 하나이며 프로그램 작성 방법을 배우는 데 필요한 부분 중 하나는 자신의 프로그램을 디버깅하는 것입니다. 당신, 나 또는 user0042가 쓰는 프로그램이 실수를 포함 할 수있는 이상 현상은 아닙니다. 가장 먼저해야 할 일은 자신의 코드를 디버깅하는 것입니다. 당신이 원하지 않는 한 가지는 코드가 작동하지 않을 때 "최종 사용자"처럼 행동하고, "고객 지원"을 위해 StackOverflow를 호출하는 것입니다. 그것은 아주 오래되고, downvotes를 얻을 수 있습니다. – PaulMcKenzie

+1

프로그램을 실행하는 중에 오류가 발생합니다. 그렇습니까? 컴파일은 소스 코드를 실행할 수있는 실행 파일로 변환하는 프로세스입니다. –

+1

나는 초급자이며, 나는 디버깅이 무엇인지 알고 있으며 그렇다. 나는 내 코드를 디버깅하려고 시도했다. 오류가 있고 나의 "전문 기술"이 그것을 알아 차리기에 예리하지 않으면 나는 몇 시간 동안 자기 연민에 빠지기로되어 있나? 이 커뮤니티는 여러 가지 이유 때문에 초보자에게 연민이 완전히 없어서 새로운 사용자에게 매우 유독합니다. 나는 그가 요구 한 지침을 고수했다. 게시 한 코드는 간결하고 줄였습니다. 나는 약 1 시간 반 동안이 문제를 해결하기 위해 다른 일을 시도했다. 그것은 내가 작은 오류를 놓친 이상이 아니다[email protected] – hammonak

답변

0

,이 사항 :

count[fileContent[f]]++; 

가 있어야한다 : 당신이 -97하지 않으면, count 배열의 인덱스 fileContent[f]의 가치를 높이기 위해 노력하고있다

count[fileContent[f]-97]++; //Assuming that all alphabets are in lowercase 

하는 count 배열의 한계를 초과 할 수 있습니다.

또한, 모두 if 블록 continue에 있는지 확인하고 당신은 당신이 이미 f++을하고있는 for 루프로 모두 if 블록에 명시 적으로 f++을 수행 할 필요가 없습니다.

+0

고마워요! 내 질문에 대답하기 위해 노력한 것에 감사드립니다! – hammonak

0

C 스타일의 배열, 코드의 매직 넘버를 사용하여 모든 곳에서 버퍼 오버 플로우 위험이 있습니다.

이에 코드를 비교 :

for (auto& item : counts) 
    cout << item.first << ": " << item.second << '\n'; 
: (당신은 발생하지 않았다 문자 0을 인쇄하지 않을 경우)

#include <string> 
#include <iostream> 
#include <map> 
using namespace std; 

int main() 
{ 
    string fileContent = "qr rqh zrxog kdyh eholhyhg lq wkh odvw bhduv ri wkh qlqhwhhqwk fhqwxub wkdw wklv"; 
    map<char, int> counts; 

    for (char ch : fileContent) 
     ++counts[ch]; 

    for (char ch = 'a'; ch <= 'z'; ++ch) 
     cout << ch << ": " << counts[ch] << '\n'; 
} 

또는 당신이 사용할 수있는 모든지도의 내용을 인쇄

독자가 공백과 숫자를 제외하는 코드를 추가하는 연습을하십시오. 힌트 : cctype 헤더를 찾습니다.

+0

제안 해 주셔서 감사합니다. (""및 "auto"와 같은) 사용 된 것들 중 일부에 대해 완전히 익숙하지는 않지만 이것을 살펴 보겠습니다. – hammonak

+0

@hammonak ''헤더에 'std :: map'유형이 들어 있습니다. 한 가지 (키)를 사용하여 다른 것을 조회 할 수 있습니다 (값). 예를 들어, 사전은 단어에서 정의까지의 맵이며 전화 번호부는 이름에서 전화 번호까지의 맵입니다. 'auto' 키워드는 컴파일러에게 "당신은 이것이 어떤 유형인지 알고 있습니다; 전체를 철자하게하지 마십시오."; 그것은 많은 방법으로 유용하지만 때로는 학습의 방법으로 얻을 수 있습니다. 이 경우'pair '을 의미합니다. –

+0

잘 주셔서 감사합니다 함께 유익한 설명 @ 대니얼 H – hammonak