2012-01-23 2 views
0

사용자는 몇 개의 문자열을 입력하고 완료 될 때 문자열을 입력해야합니다. 코드는 가장 길고 가장 짧은 단어가 반환되어야합니다.strcpy 및 strcmp, 내가 뭘 잘못하고 있니?

을 strcmp는 항상 내가 잘못하고있는 무슨 ... -1 반환? cplusplus.com 가입일

#include <iostream> 
#include <cstring> 
using namespace std; 
int main() { 
    char S[100][20]; 
    int I = 0; 
    do { 
      cout << "Enter text:" << endl; 
      cin.getline(S[I],100); 
    } while (I < 19 && strcmp(S[I++],"")); 
    char Max[100], Min[100]; 
    strcpy(Max, S[0]); 
    strcpy(Min, S[0]); 
    for (int J = 1; J < I; J++) { 
     if (strcmp(S[J], Max) == 1) 
      strcpy(Max, S[J]); 
     if (strcmp(S[J], Min) == -1) 
      strcpy(Min, S[J]); 
    } 
    cout << "Max = " << Max << endl; 
    cout << "Min = " << Min << endl; 
    system("pause"); 
    return 0; 
} 
+0

'strcmp'는 어느 문자열이 길거나 짧은 지보고하지 않습니다. 'strlen'을 사용하려고 했습니까? –

+0

strlen을 사용하는 방법을 알고 있지만 할당은 strcmp를 사용한다고합니다. – eqagunn

답변

2

그래서, 몇 가지 :

  • 변수는 소문자로해야한다;
  • 당신이 잘못된 길이 문자열의 배열을 정의하는
  • (s[20][100]해야한다);
  • 일 때 while주기에 'i < 20'까지 가야합니다.
  • 배열의 마지막 문자열은 항상 빈 문자열입니다 (따라서 : s_min는 항상 비어를);
  • strcmp 문자열, 그것은 가장 긴 어느 쪽이 당신에게하지 않습니다 비교합니다. 그걸 위해서 strlen을 사용해야합니다 ...여기에 작업 코드

:

#include <iostream> 
#include <cstring> 
using namespace std; 

int main() { 
    char s[20][100]; 
    int i = 0; 
    do { 
    cout << "Enter text:" << endl; 
    cin.getline(s[i], 100); 
    } while (i < 20 && strcmp(s[i++],"")); 

    char s_max[100], s_min[100]; 
    strcpy(s_max, s[0]); 
    strcpy(s_min, s[0]); 
    for (int j = 1; j < i-1; j++) { 
    if (strlen(s[j]) > strlen(s_max)) 
     strcpy(s_max, s[j]); 
    if (strlen(s[j]) < strlen(s_min)) 
     strcpy(s_min, s[j]); 
    } 

    cout << "Max = " << s_max << endl; 
    cout << "Min = " << s_min << endl; 
    return 0; 
} 
+1

변수는 소문자 여야합니까? 이는 전적으로 무의미하며 최악의 경우 C++의 일반적인 관행과는 확연히 다릅니다. –

+0

컴파일러와 관련이 없으므로 코드를 잘 읽는 것이 중요합니다. 나는 표준을 따르지 않는 출처를 읽을 때 진심으로 두통을 겪습니다. 비록 내 생각에 .. – StefanoP

+0

mm 이니 코드 재발행 가능성에 대해서 이야기 할 때 그 변수가 중요한 이름을 가져야한다고 생각해야한다.'char [20] [100] 대신'char strings [20] [100]' ]'. 어쨌든, 제 생각에는 대규모 응용 프로그램을 개발할 때 이러한 맥락에서 관련성이 없습니다. 그러나 이것은 단지 운동 일뿐입니다. –

1

:

는 문자열의 관계를 나타내는 정수 값을 반환 값이 0이 두 문자열이 동일한 것을 나타낸다. 0보다 큰 값 은 이 아닌 첫 번째 문자가 str1에서 str2보다 큰 값을 가짐을 나타냅니다. 그리고 보다 작은 값은 반대를 나타냅니다.

은 1이어야한다 -1은 또한>/< 0으로 시험하려고 테스트 STDIO로부터 판독 된 문자열은 '\ 0으로 끝나는 경우 결국 때문에 (의 getline 정상적으로) 추가 strcmp는 그것을 사용합니다.

또한 배열 크기가 잘못된 경우. char S[20][100]이어야합니다.

+0

그래, 나는>/<0으로 변경하고 배열 크기를 고정시켰다. 그러나 John, David 및 Leo에 문자열을 입력하면 첫 번째 strcmp는 여전히 -1을 반환하지만 분명히 양수 값을 반환해야합니다. 그리고/0을 확인하는 방법을 모르겠습니다. – eqagunn

+0

getline() 끝 부분에 null char 추가 - 나머지를 찾으십시오. –

+0

이 VS2010에서 작동합니까? 어떤 컴파일러를 사용하고 있습니까? 또한 입력을 끝내면 마지막 줄을 고려하지 말아야합니다. –

2

시도 사용 숯 S [20] [100]; 대신 char S [100] [20];

0
  1. 당신은 거꾸로 배열을 선언하고; 당신이 정말로 원하는 것 같습니다 char S[20][100].
  2. strcmp()은 1 또는 -1을 반환한다고 보장 할 수 없으므로 < 0> 0을 사용하여 비교해야합니다. man page에서 :

    strcmp()strncmp() 함수는 각각의 정수, 이하 동일 돌아가거나 제로보다 큰 S1 (또는 그 제 N 바이트)가 발견되면 보다 작거나 일치하거나 s2보다 커야합니다.

0

당신은 당신의 코드에서 문자열을 비교하기 위해 노력하고 있지만 귀하의 질문은 당신이 길이를 비교하려는 말한다. 길이를 비교하려면 Null 종료 문자열에 strlen을 사용하십시오. Here이 참조 정보입니다. 더 좋은 점은, 작성중인 내용이 C++ 코드 (태그가 붙어있는 경우)이기 때문에 이미 표준 라이브러리를 사용하고 있으므로 std::string을 사용하십시오. 이것은 숙제를 태그해야하는 것처럼 들리지만, 어떤 경우에는 std::string 클래스를 사용할 수 없다고 가정합니다.

관련 문제