2017-03-10 1 views
2

C에서 사용자로부터 문자열을 가져 오는 프로그램을 작성했습니다 (50자를 한계로 함). 대문자로 된 문자를 upper으로, 소문자를 lower으로 지정하면 결국 해당 문자열 (upper)을 인쇄합니다. 내 문제는 문자열을 입력 할 때 한 문자열 만 인쇄하는 것입니다. 예를 들어 문자열이 위쪽 문자로 시작하는 경우 upper이 인쇄됩니다. 두 개가 아닌. 당신은 당신의 배열 모두에 대한 반복자로 J를 사용하는C에서 문자열의 문자를 세어 다른 그룹 (소문자 및 대문자)에 할당하는 방법

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <time.h> 
#include <math.h> 

#define MAX_LEN 50 

int main() 
{ 
    char str[MAX_LEN] = { 0 }; 
    char upper[MAX_LEN] = { 0 }; 
    char lower[MAX_LEN] = { 0 }; 
    int i = 0; 
    int j = 0; 

    printf("Enter a string: "); 
    fgets(str, MAX_LEN, stdin); 
    str[strcspn(str, "\n")] = 0; 

    for (i = 0; i < strlen(str); i++) 
    { 
     if (str[i] > 'A' && str[i] < 'Z') 
     { 
      upper[j] = str[i]; 
     } 
     else if (str[i] > 'a' && str[i] < 'z') 
     { 
      lower[j] = str[i]; 
     } 
     j++; 
    } 

    printf("%s", upper); 
    printf("%s", lower); 

    getch(); 
    return 0; 
} 
+4

하위 변수와 상위 변수에 대해 동일한 색인 변수 j를 사용하고 있습니다. 둘 다 다른 변수를 사용하십시오. – Ayush

+1

또한'> 'A'' ->'> ='A'' – BLUEPIXY

+1

[ctype.h는 isupper와 islower를 제공합니다] (https://en.wikipedia.org/wiki/C_character_classification#Overview_of_functions) 현재 로케일. – Schwern

답변

1

두 개의 배열에 대해 하나의 카운터를 사용합니다. 입력 한 배열에 상관없이 카운터를 증가시킵니다. 따라서 처리 할 첫 번째 문자는 이 아닌 배열을이 아닌 C 문자열 NULL 종결 자로 결정합니다.

그래서? 따라서 printf()을 사용하면 %s을 사용할 때 NULL 종결자를 만나는 즉시 인쇄가 중지되며 모든 기능은 <stdio.h>입니다. BTW, 당신은 그 도서관을 포함하는 것을 잊었습니다.

하나의 해결책은. 두 개의 카운터, 모든 배열을 사용하고 우리가 채워 배열의 카운터를 증가 또한

수 '는'너무 고려하는 대신 >>=을 사용할 수 있습니다. 마찬가지로 'z'와 그들의 수도. 그들 모두를 퍼팅

함께 당신이 뭔가를 얻을 :

#include <string.h> 
#include <time.h> 
#include <math.h> 
#include <stdio.h> // you hadn't include that! 

#define MAX_LEN 50 

int main() 
{ 
    char str[MAX_LEN] = { 0 }; 
    char upper[MAX_LEN] = { 0 }; 
    char lower[MAX_LEN] = { 0 }; 
    int i = 0; 
    int j = 0; // counter for 'upper' 
    int k = 0; // counter for 'lower' 

    printf("Enter a string: "); 
    fgets(str, MAX_LEN, stdin); 
    str[strcspn(str, "\n")] = 0; 

    for (i = 0; i < strlen(str); i++) 
    { 
     if (str[i] >= 'A' && str[i] <= 'Z') // use the equal operator as well for reading 'A' and 'Z' as well 
     { 
      upper[j++] = str[i]; // increment the counter 'j' 
     } 
     else if (str[i] >= 'a' && str[i] <= 'z') // use the equal operator as well for reading 'a' and 'z' as well 
     { 
      lower[k++] = str[i]; // increment the counter 'k' 
     } 
    } 

    // print your strings, but use a newline for aesthetics 
    printf("%s\n", upper); 
    printf("%s\n", lower); 

    return 0; 
} 

출력 : upperlower에 대한 당신의 if-statements

Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c 
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
Enter a string: Samaras 
S 
amaras 
0

:

여기 내 코드입니다. 너는 그렇게하지 않는다. 그렇게하면, 다른 배열의 첫 번째 자리에 '\ 0'을 가질 수 있고 쓰여지지 않습니다. 당신은 하나 개의 값을 추가하는 경우에만 당신이 당신의 배열에 itering 여기에

#include <stdlib.h> 
    #include <stdio.h> 
    #include <string.h> 
    #include <time.h> 
    #include <math.h> 

    #define MAX_LEN 50 

    int main() 
    { 
     char str[MAX_LEN] = { 0 }; 
     char upper[MAX_LEN] = { 0 }; 
     char lower[MAX_LEN] = { 0 }; 
     int i = 0; 
     int j = 0, h = 0; 

     printf("Enter a string: "); 
     fgets(str, MAX_LEN, stdin); 
     str[strcspn(str, "\n")] = 0; 

     for (i = 0; i < strlen(str); i++) 
     { 
      if (str[i] >= 'A' && str[i] <= 'Z') 
      { 
       upper[j++] = str[i]; 
      } 
      else if (str[i] > 'a' && str[i] < 'z') 
      { 
       lower[h++] = str[i]; 
      } 
     } 

     printf("%s", upper); 
     printf("%s", lower); 

     return 0; 
    } 

:

그래서 당신은 그렇게해야한다. 덧글에 언급 된 바와 같이 str[i] >= 'A' && str[i] <= 'Z'은 아니요 str[i] > 'A' && str[i] < 'Z'

3

를 사용하여 서로 다른 인덱스 변수, > 운영자 >=에 유사하게 변경 < ~ <=

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <time.h> 
#include <math.h> 

#define MAX_LEN 50 

int main() 
{ 
    char str[MAX_LEN] = { 0 }; 
    char upper[MAX_LEN] = { 0 }; 
    char lower[MAX_LEN] = { 0 }; 
    int i = 0; 
    int up = 0, low = 0; 

    printf("Enter a string: "); 
    fgets(str, MAX_LEN, stdin); 
    str[strcspn(str, "\n")] = 0; 

    for (i = 0; i < strlen(str); i++) 
    { 
     if (str[i] >= 'A' && str[i] <= 'Z') 
     { 
      upper[up] = str[i]; 
      up++; 
     } 
     else if (str[i] >= 'a' && str[i] <= 'z') 
     { 
      lower[low] = str[i]; 
      low++; 
     } 
    } 

    printf("%s\n", upper); 

    printf("%s", lower); 

    getch(); 
    return 0; 
} 
관련 문제