2010-03-19 3 views
2

C 프로그램을 작성하고 있지만 char 배열에 문제가 있습니다. 내가 prinf를 사용하여 인쇄 할 때 나는 쓰레기를 계속 가지고 간다. 여기에 내가 그것을 인쇄 할 때 내가 무엇을 얻을의 예입니다 t.symbol에서어떻게 문자 배열로 쓰레기를 없애 버리시겠습니까?

문자가 Aôÿ¿이다가
TABL에서 문자 [0] .symbol는 TABL에서의
문자 [1] .symbol가된다 TABL에서
CHAR [2] .symbol가 TABL에서
CHAR [3] .symbol가 TABL에서
숯불 D [4] .symbol가 TABL에서 E
문자 인 [5] .symbol는
을 f를 문자가 tabl [6]. 기호가 g
문자가 tabl [7]. 기호가 h
문자가 tabl입니다. [9] .symbol는 A4
@ t에서 X
CHAR [0] a0AÃ인 .symbol
톤에서 CHAR [1] B는 .symbol된다) [8] .symbol가 TABL에서
CHAR 난에게이다 t [2]에서 .symbol
숯불 ckU 인 *
t에서 CHAR [3] Aôÿ¿
인 .symbol
t에서 CHAR [4]

갈 수인 .symbol 누군가 어떻게해야하는지 말해줘. chars의 배열에서 쓰레기를 없애 버려?

여기

#define MAX 100 
#ifndef SYMBSIZE 
#define SYMBSIZE 1 
#endif  

typedef struct tableme 
{ 
    char symbol[SYMBSIZE]; 
    int value; 
    int casenmbr; 
    int otherinfo; 
}tabletype; 
int main(int argc, char **argv) 
{ 
    tabletype t[MAX]; 
    t[3].symbol[0] = 'A'; 

    t[0].value=1; 
    t[0].casenmbr = 7; 
    t[0].otherinfo = 682; 

    tabletype tabl[MAX]; 
    tabl[0].value = 1; 
    tabl[0].symbol[0] = 'A'; 
    tabl[1].value = 11; 
    tabl[1].symbol[0]= 'a'; 
    tabl[2].value = 12; 
    tabl[2].symbol[0] = 'a'; 
    tabl[3].value = 13; 
    tabl[3].symbol[0] = 'd'; 
    tabl[4].value = 14; 
    tabl[4].symbol[0] = 'e'; 
    tabl[5].value = 15; 
    tabl[5].symbol[0] = 'f'; 
    tabl[6].value = 16; 
    tabl[6].symbol[0] = 'g'; 
    tabl[7].value = 17; 
    tabl[7].symbol[0] = 'h'; 
    tabl[8].symbol[0] = 'i'; 
    tabl[9].symbol[0] = 'x'; 
    t[1].symbol[0] = 'b'; 
    t[0].symbol[0]= 'a'; 
    t[2].symbol[0]= 'c'; 

    t[4].symbol[0]= 'g'; 
    printf("char at t.symbol is %s \n", t[3].symbol); 

    for(x=0;x<10;x++) 
    { 
      printf("char at tabl[%d].symbol is %s \n",x, tabl[x].symbol); 
    } 
    int j; 
    for(j = 0; j<5;j++) 
    { 
      printf("char at t[%d].symbol is %s \n",j, t[j].symbol); 
    } 
    return 0; 
} 

답변

4

두 가지 가능한 문제 중 하나가 있습니다. 당신이 정말로 단지 하나의 문자를하려는 경우, 당신은이 같은하지 %s, %c로 인쇄해야합니다

printf("char at t.symbol is %c \n", t[3].symbol[0]); 

당신이 정말로 상징의 최대 길이보다 1 높은 것으로 당신이 SYMBSIZE을 정의 할 필요가 문자열을 원하는 경우 끝에 NUL (\0) 문자를 넣습니다. 당신은 그것을 몇 가지 작업을 수행 할 수 있습니다 당신은 문자를 원하는 경우

  1. tabl[6].symbol[0] = 'g'; tabl[6].symbol[1] = '\0';
  2. strcpy(tabl[6].symbol, "g");
+0

감사합니다. 내 문제가 해결되었습니다. –

+0

gabe가 말한 것에 대한 확장으로서 문자열로 인쇄하려고 할 때 여분의 횡설수설이 생기는 이유는 배열이 초기화되지 않았기 때문입니다. 당신이 볼 수있는 횡설수설은 할당되었을 때 배열에 의해 사용 된 메모리에 있었던 쓰레기입니다. – bta

2

귀하의 배열 당신은 널 문자를위한 별도의 공간이 필요합니다.에 저장하는 문자열에 충분히 큰되지 않습니다 내 코드입니다. SYMBSIZE를 2로 변경하거나 char로 인쇄하십시오. 둘 중 하나가 작동해야합니다.

편집 : 또한, 당신은 어쨌든 null 문자를 넣지 않을거야. 문자열을 출력하는 것은 \ 0에 도달 할 때까지 계속 될 것이므로 SYMBSIZE = 2을 만들고 나서 문자열로 인쇄하려면 symbol[1] = '\0';으로 만들어야합니다.

EDIT2 : 아니면 그냥 %s%c로 변경 당신이의 printf에서 % C를 사용되어야 할 문자를 인쇄하려면

+0

감사 –

2

(시간 대신 전체 문자열에 하나의 문자를 인쇄).

printf("char at t.symbol is %c \n", t[3].symbol); 

컴파일러는 형식 문자열이 전달 된 값과 일치하지 않는다고 경고해야합니다. 이유가 있기 때문에 컴파일러 경고가 있습니다.

+0

시간 내 주셔서 감사하고 내가 strcpy를 사용하려고하지만 세그먼트 오류를 ​​얻고 있었다, 그러나 나는 생각이있어 –

3

문제는 C의 문자열이 null로 종료된다는 것입니다. 그러나 배열은 한 문자에 대해서만 충분히 크기 때문에 null로 끝날 수는 없습니다 (최소 2 자 이상이어야합니다).

왜 쓰레기가 나옵니까? tabl[0].symbol[0] = 'A';라고 말하면 메모리에 tabl[0].symbol[0]A???이 있으며 무엇이 ???인지 알 수 없습니다. 분명히, 때로는 0 (올바른 출력을 얻는 곳), 때로는 (쓰레기)이 아닙니다.

이 문제를 해결하려면 %c 형식 지정자를 사용하여 Null 종료 문자열 대신 단일 문자를 인쇄하십시오.당신이 정말로 문자열을 인쇄 할 경우에, 당신은 당신의 캐릭터 라인 버퍼가 큰해야하고 null가-종료 :

SYMBSIZE = 10는 다음 tabl[0].symbol[1] = '\0'; 주를 가지고, 당신은 일반적으로 문자열 함수 사용하려는

:

// copy "a" to that memory location, will be null-terminated. 
strcpy(tabl[0].symbol, "a"); 

만약 당신의 버퍼가 문자열에 대해 충분히 크지 않으면 버퍼를 오버런시킵니다.

+0

G 맨을 도와줍니다. 나는 단지 '\ 0'을 내 문자열 끝에두고 쓰레기는 사라졌다. 도와 주셔서 감사합니다 –

+0

strcpy에 인수를 바꿔야합니다 – peje

+0

@peje : 감사합니다, 깜빡했습니다. – GManNickG

2

는, 당신은 문자를 인쇄 할 %의 C가 아닌 % s의를 사용해야합니다.

printf("char at tabl[%d].symbol is %c \n",x, tabl[x].symbol); 
+0

시간 내 주셔서 감사합니다. –

0

문제를 해결할 방법이 있습니다. 기본적으로 일단 char 배열을 초기화하면 가비지 값을 NUll로 재정의해야합니다. 당신의 도움에 대한 enter code here

void main() 
{ 
    int amsb[10]; 
    int i,k,i1; 
    char arr[25]; 
    clrscr(); 
    printf("Enter the 10 element"); 

    for(i1=0;i1<25;i1++) { 
     arr[i1]='\0'; 
    } 

    for(k=0;k<25;k++) { 
     printf("%c",arr[k]) ; 

     if(arr[k]=='\0') { 
      break;     
     } 
    } 

    getch(); 
} 
관련 문제