2014-10-23 2 views
-1

이 포럼과 튜토리얼을 탐색 할 때 적절한 형식 (내 생각)으로 조정했지만 단 하나의 항목 만 빠져있는 동안이 주제는 관련 주제라고 생각합니다. for 루프를 사용하여 정수를 취하고 정수에서 c-string 값을 할당하려면 어떻게해야합니까?for 루프를 사용한 C 문자열 할당

저는 지금 바이너리 부분의 정수에 초점을 맞추고 있습니다. 제 숫자 조작은 확실합니다. 그러나 우리 교수는 이진 값을 C 문자열에 할당해야한다고했습니다. 그리고 이것을 시도하고 있는데 const char과 char *을 컴파일러를 통해 사용하고 있다고합니다. 어떻게 이런 일이 일어나고 있는지, 또는 어떻게 막을 지 모르겠습니다.

가 여기 내 소스 코드입니다 :

//sample integer to binary 

#include <iomanip> 
#include <iostream> 
#include <iomanip> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    int num; //the number a user enters 
    int rem; //the remainder, the 1 and 0 of the binary number 
    int x; //a variable to store the number after division 

    char binary[10]; //c-string initialized to 10, perhaps that is too many. 

    cout << "Enter a number: "; 
    cin >> num; 

    for (int i = 0; i < 10; i++) 
    { 
     x = num/2;  
     cout << x << endl; //this shows that the code is working 
     rem = num % 2; 
     cout << num << endl; //this also shows the code is working 

     char r = (char)rem; //These two lines of code are 
     strcpy(binary[i], r); //preventing compilation 

     cout << binary[i] << endl; // this is diagnostic 
     num = x; 
    } 

    cout << "The number " << num << " is " << binary[5] << " in binary.\n"; 

    return 0; 
} 

감사 당신이, 내가이 일을 (거의) 만들 수있었습니다. 나는 예기치 않은 행동을하고 있는데 배열을 초기화하는 것이 얼마나 큰지 잘 모르겠다.별로 중요하지 않다고 생각하지만, 그레이더가 얼마나 큰 숫자를 사용하는지 정확히 알지 못한다. 테스트 할.

어쨌든, 여기에 새로운 코드입니다 : 여기

#include <iomanip> 
#include <iostream> 
#include <iomanip> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    int num; //the number a user enters 
    int rem; //the remainder, the 1 and 0 of the binary number 
    int x; //a variable to store the number after division 

    char binary[5] = {'0', '\0'}; //c-string initialized to 10, perhaps that is too many. 

    cout << "Enter a number: "; 
    cin >> num; 

    for (int i = 0; i < 10; i++) 
    { 
     x = num/2;  
     //cout << x << endl; //this shows that the code is working 
     rem = num % 2; 
     //cout << num << endl; //also shows the code is working 

     binary[i] = '0' + rem; //not sure what this is doing, but it works. 

     //cout << binary[i] << endl; // this is diagnostic 
     num = x; 
    } 

    cout << "The number " << num << " is " << binary << " in binary.\n"; 

    return 0; 
} 

그리고 출력입니다 :

는 번호를 입력 : 5 수 0 이진 1010000000 #입니다.

0과 # 기호없이 숫자, 초기 숫자 및 말하기 101을 나타내야합니다.

+1

당신은 C 스타일 문자열을 사용하는 이유라도? – clcto

+0

배열을 사용해 보았지만 이상한 숫자가 나왔습니다. 내가 설정 한 방식대로하는 것은 진단 코드가 보여주는 것만 1과 0으로 제공해야합니다. – Tamra

+0

그리고 난 정말 선택의 여지가 없어! 그것은 과제의 일부입니다. :/우리가 다루는 새로운 주제입니다. C- 문자열. – Tamra

답변

1

strcpy은 전체 NUL 종료 문자열을 복사하기위한 것입니다. 한 문자 만 설정하려면 =을 사용할 수 있습니다.

binary[i] = '0' + r; 

이를 추가하는 것을 잊지 마세요 : 당신이 바로 일을하거나 나중에 C 문자열로 binary을 치료하기 위해 라인 cout << binary[i]을 원하는 경우

binary[i] = r; 

그러나, 당신은 ASCII 숫자를 저장해야 문자열을 NUL로 끝내면, 지금은 C 스타일의 문자열이 아닙니다.

+0

바이너리 [i] = r; <- 이전에이 코드를 사용했습니다. 그것은 바로 인쇄가 아니었고, 나는 이것을 시도 할 것이지만 왜 우리는 '0'을 추가합니까? 당신이하고있는 일을 완전히 이해하고 싶습니다. – Tamra

+0

@ Tamra : Barmar와 저는 모두 '0'을 추가하고 있습니다. 우리는 다른 라인에서 그것을하고 있습니다. –

+0

내가 바이너리 [i] = rem이라고 말했을 때 문자열 값인 # – Tamra

1

strcpy()에 대한 인수는 이 아니라 char*입니다. 두 번째 인수는 널 종료 문자열을 가리켜 야하지만 r은 단일 문자입니다. 배열의 요소에 문자를 지정하려면 수행

binary[i] = r; 

하지만 rem의 이진 값을 원하지 않는다, 당신은 이진 값을 나타내는 문자를합니다. 그것은해야한다 : 문자열로 binary를 인쇄하기 위해

char r = '0' + rem; 

, 당신은 그것을 널 (NULL) 종료를 제공해야합니다. 문자열에 10 자리 숫자를 넣으므로 종결자를 보유 할 추가 문자를 선언해야하며 제대로 종료 될 수 있도록 0으로 초기화해야합니다.

이미 지적 문제뿐만 아니라
cout << "The number " << num << " is " << binary << " in binary.\n"; 
0

, 이진 숫자를 얻을 :

char binary[11] = {0}; 

그리고 당신은 전체 문자열을 인쇄 할 경우, 당신은 binary[5]을 참조하지합니다, 당신은 전체 배열을 인쇄해야합니다 역순으로 완료되면 이진 표현의 유효 자릿수를 반올림하고 역 문자를 계산해야합니다.

문자 버퍼를 올바르게 초기화하지 않았으므로 인쇄물에 쓰레기가 나오게됩니다.

버퍼 크기는 변환 할 정수 유형의 비트 수만큼 더 필요하며 '\ 0'을 종료 할 때 하나 더 필요하므로 32 비트 숫자의 경우 33 자 크기의 버퍼가 필요합니다. . 그리고 버퍼를 오버런 시키면 아주 불쾌한 일이 일어날 것이기 때문에 이것은 중요합니다.

그리고 또 하나주의 : 문자열 표현으로 변환해야하는 숫자는 부호가 없으므로 이에 대해 명시해야한다고 가정합니다. 다음은 최소한의 오류 검사와 신속하고 더러운 구현 :

char *unsigned_to_binstr (unsigned n, char *binary, int buf_len) 
{ 
    int i, j; 

    if (buf_len < 2) 
     return NULL; 

    i = 0; 
    do { 
     binary[i++] = '0' + n % 2; 
     n /= 2; 
    } while (n && i < buf_len); 

    for (j = 0; j < i/2; ++j) { 
     char temp = binary[j]; 
     binary[j] = binary[i-j-1]; 
     binary[i-j-1] = temp; 
    } 

    binary[i] = '\0'; 

    return binary; 
} 
+0

그러나 코드가 얼마나 깨끗한 지 알고 싶습니다. 코드가 무엇을하는지 전혀 알지 못합니다. 나는 여전히 cs 클래스 입문! 내 답변을 올리겠습니다. 이는 귀하의 코드와 비교해 볼 때 엄청난 양의 코드입니다. 그러나 비효율적이지만 일을 처리하게 만듭니다. – Tamra

0

모든 사람의 의견 후에는, 나의 교과서를 통해 내 자신의 연구 나는 다소 작업 기능을 공식화 할 수 있었다. 그러나, 그 과정에서 나는 쓰레기 문제에 대해 궁금해하기 시작했다. 그래서 나의 해결책 .. 자른다! 나는 if 절을 추가했다. (loop 표현을 생각해 봤지만 어떤 아이디어도 얻지 못했다.) 끝에는 if 절을 통해 제공된 길이를 사용하고 1을 빼면 그 숫자에 맞는 비트 크기를 얻을 수있다. 클래스에서 다루었던 기본적인 C++ 지식을 사용하면 내가 생각해 낸 해결책이지만 원유 및 비효율적 일 수 있습니다!

나는 당신 모두에게 감사하고 싶습니다. 나는 그것이 당신에게 맞지 않는다면 내가 붙어 있던 점을 지나칠 수 없었습니다!

여기 내 거친 최종 개정의 :

//sample integer to binary 

#include <iostream> 

using namespace std; 

int main() 
{ 
    int num; //the number a user enters 
    int rem; //the remainder, the 1 and 0 of the binary number 
    int x; //a variable to store the number after division 
    int l; //length of c-string function 

    cout << "Enter a number: "; 
    cin >> num; //user input 

    if ((num == 1) || (num == 0)) // the following 17 lines of code are to truncate the string  size. 
     l = 2; 
    if ((num > 1) && (num < 4)) 
     l = 3; 
    if ((num >= 4) && (num <= 7)) 
     l = 4; 
    if ((num >= 8) && (num <= 15)) 
     l = 5; 
    if ((num >= 16) && (num <= 31)) 
     l = 6; 
    if ((num >= 32) && (num <= 63)) 
     l = 7; 
    if ((num >= 64) && (num <= 127)) 
     l = 8; 
    if ((num >= 128) && (num <= 255)) 
     l = 9; 
    if ((num > 255)) 
     cout << "This number is too large for this string\n"; // I don't think the binary sequence should be larger than 16 bits. 

    char binary[l]; //c-string initialized to size according to the truncation rules above 

    for (int i = l - 1; i > 0; i--) //goes in reverse order, as binary counts from bottom to top. 
    { 
     x = num/2;  
     rem = num % 2; 
     num = x; 

     binary[i] = '0' + rem; // added an 
    } 



    for (int i = 0; i <= l-1; i++) 
    { 
     cout << binary[i]; 
    } 

    cout << " in binary.\n"; 

    return 0; 
}