2015-01-06 4 views
0

일부 연습 프로그램을 작성 중이며 아래 함수에서 문제가 발생했습니다. 의도 한대로 char 배열이 아닌 정수를 반환합니다. 이 코드는 사용자가 먼저 문자열을 입력하고 제거하려는 문자를 입력하는 것을 의미합니다. squeez 함수는 양쪽 모두를 받아서 주어진 문자가없는 문자열을 출력합니다. 함수가 char 대신 int를 반환합니다.

현재 내 기능은 경고를 제공합니다
수익률은 [기본적으로 활성화] 캐스트

나는 기능이 유형은이 2 오류를 표시 B/C 'INT'를 반환 알고없이 포인터의 정수를 만든다 :
형식 '% s'은 (는) '의 char *'형식의 인수를 기대하지만, 인수 2 'INT'를 입력있다 [-Wformat =]

/* Squeeze Function */ 

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

char squeez(char s[], int c) 
{ 
    int i, j; 

    for (i = j = 0; s[i] != '\0'; i++) 
    { 
     if (s[i] != c) 
     { 
      s[j++] = s[i]; 
     } 
    printf("%c %d", s[i], c); 
    } 
    printf("%s", s); 
    s[j] = '\0'; 
    return s; 
} 

int main(void) 
{ 
    int i, c; 
    char str[10]; 

    for (i = 0; (c = getchar()) != '\n'; ++i) 
    { 
     str[i] = c; 
    } 
    c = getchar(); 
    printf("%s", squeez(str, c)); 
    return EXIT_SUCCESS; 
} 

모든 모든 도움을 주시면 감사하겠습니다 감사합니다!

답변

4

당신은 char *에 반환 형식을 변경해야합니다 :

char *squeez(char s[], int c) { 
    … 
    return s; 
} 

을 ... s 포인터 (문자열의 첫 번째 문자의 주소)이기 때문이다.


두 번째 문제는 squeez()'\0' 터미네이터를 찾는 것입니다,하지만 당신은 거기에 하나를 작성하지 않습니다. 세 번째 문제는 10 바이트 버퍼가 오버 플로우 될 수 있다는 것입니다. main()의 루프는 더 비슷하게 보입니다.

#include <assert.h> 

int main(void) 
{ 
    int i; 
    char str[10]; 

    for (i = 0; i < sizeof(str) - 1; i++) 
    { 
     if ((str[i] = getchar()) == '\n') 
     { 
      break; 
     } 
    } 
    assert((i == sizeof(str) - 1) || (str[i] == '\n')); 
    str[i] = '\0'; 
    printf("%s", squeez(str, getchar())); 
} 
+1

간단히 설명해 주시겠습니까? – user1234567878787

+1

return이라고 말하면 컴파일러는 문자열 s에 포인터를 반환하지만 문자열 자체는 반환하지 않습니다. 하지만 당신의 함수는 char의 리턴 타입을 기대하고 있으므로 char 포인터를 char로 변환합니다. 반환 유형을 변경하면 문제가 해결됩니다. – sumithdev

0

실제로는 char 포인터를 반환합니다. 따라서 함수의 반환 유형은 char *이어야합니다.

0

문자 포인터를 반환해야합니다. charchar *으로 변경하십시오.

char를 사용하는 경우 단일 문자로 간주됩니다. 따라서 char을 사용할 때 문자 만 반환 할 수 있습니다. 이렇게.

return s[0]; or else a character variable. 
관련 문제