2012-11-16 2 views
0

이 프로그램은 ascii 값에서 97을 뺀 값으로 char (문자열)의 배열을 정수 배열로 변환합니다 (입력은 소문자이어야하고 a는 ascii 값 97를 가져야합니다). 그래서 abcd 문자열을 입력하면 0123을 얻지 만 대신 어떻게 든 이걸 얻습니다 : 012134513789. 문제가 어디인지 알 수 없습니다.char 배열을 int 배열로 변환하는이 함수가 작동하지 않습니까?

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 

void userEnter(int*pattern, int n); 



int main(void) 
{ 
int n, i; 
printf("What is the length of the array: "); 
scanf("%d",&n); 
int pattern[n]; 
printf("Enter the char array: "); 
userEnter(pattern, n); 
printf("The int array is: "); 
for(i=0;i<n;i++) 
{ 
printf("%d",pattern[i]); 
} 
printf("\n"); 

} 

void userEnter(int*pattern, int n) 
{ 
    char input[n]; 
    scanf("%s", input); 

    int i; 
    for(i = 0; i < n-1; i++) 
    { 
     pattern[i] = input[i]-97; 
    } 
} 
+0

유효한 문법을 ​​사용하고 코드를 올바르게 들여 쓰기 바랍니다. –

+1

'scanf ("% s", input);에 대기 버퍼 오버 플로우가 있고'n-1' 문자 이상을 입력하면'main'에서'n'을 덮어 쓰면됩니다. 'n-1' 문자 이상을 입력하지 않으면 제대로 동작합니다. –

답변

1
char input[n]; 
scanf("%s", &input); 

char input[n+1]; 
scanf("%s", input); 

input을 사용하면 사용자가 입력 한 문자열을 종료 NUL 문자가 발생하는 경우도 userEnter에 for 루프를 종료한다 &input[0]

에 해당해야한다 . 예 : KingsIndian가 지적 하듯이

char* p = input; 
while (*p != '\0') { 
    *pattern = (*p) - 'a'; 
    p++; 
    pattern++; 
} 

같은, 당신은 또한 당신의 input 버퍼의 크기를 늘려야합니다. 현재 버퍼를 오버플로하고 루프 카운터를 덮어 씁니다. i;

+0

네, 그래도 출력은 같습니다. – Easytoread

+0

놀라운 결과물을 설명하기 위해 내 대답을 업데이트했습니다. – simonc

+0

감사합니다! – Easytoread

1

길이 매개 변수 n에는 널 문자도 하나 포함됩니다. 따라서 길이를 n 4로 입력하면 3 문자 만 입력 할 수 있습니다 (예 : abc). 왜냐하면 4 번째 문자가 null이기 때문입니다.

그래서 당신은 그에 따라 선언을 변경해야합니다 :

변경 :

char input[n]; 

에 : 가변 길이 배열은 C99 이후 허가되는 것을

char input[n+1]; 

참고.

+0

대단히 감사합니다! – Easytoread

관련 문제