【问题标题】:why function gives me back wrong number?为什么函数给了我错误的号码?
【发布时间】:2020-03-22 11:05:30
【问题描述】:

在程序中编写并测试您自己的函数:

  1. int function1 (const char * string1, const char * string2) 按字典顺序比较两个字符串,返回 如果字符串相同,则为 0,如果 string1 早于 string2,则为 -1,如果 string1 晚于则 +1, 例如function1 ("cca" , "abcd") -> 1, function1 ("abcde", "b") -> -1
  2. int function2 (const char * string) 返回字符串中出现的唯一数字的数量, 例如function2 ("ab512af6kc1") -> 3.

    int main() {
        cout << cmp("abc","a") << endl;
    }
    int cmp(const char* string1, const char* string2) {
    
        for(int i = 0; i < len(string1); i++) {
    
            if (i == len(string1)) {
                return 0;
            } else if (string1 > string2) {
                return 1;
            } else if (string1 < string2) {
                return -1;
            }
        }
    }
    

它返回我 -1 但应该是 1,因为“abc”在字典中比“a”晚。

第二个练习呢?我不知道如何开始。

【问题讨论】:

  • 你在比较指针,使用strcmp
  • 我必须编写 OWN 函数而不是 strcmp...所以我不能使用它
  • 你可以使用std::string::compare,如果不能直接使用可以研究它的来源。
  • 如果你重新阅读你的 C++ 书并意识到 string1string2 是指针,它们的比较在这里没有意义,那就更好了。

标签: c++ arrays pointers reference


【解决方案1】:

正如我在 cmets 中发布的那样,您应该回去重新阅读您的 c++ 书。 string1string2 是指针,你不应该在这里比较它们。

这是问题 1 的有效解决方案:

#include <cstring>
#include <iostream>

int cmp(const char* string1, const char* string2) {
    int n1 = std::strlen(string1);
    int n2 = std::strlen(string2);
    int i=0;
    while (i<n1 && i<n2)
    {
        if (string1[i] < string2[i]) return -1;
        else if (string1[i] > string2[i]) return 1;
        else i++;
    }
    if (n1 == n2) return 0;
    if (i == n1) return -1;
    return 1;
}

int main()
{
    std::cout << cmp("a","abc") << std::endl;
    return 0;
}

对于第二个问题,您可以通过使用 hashmap 保持字符数来解决它。

【讨论】:

    【解决方案2】:

    Live sample of both exercises

    对于练习1,我相信目标是制作一个类似于strcmp()的函数,所以重要的不是大小而是字典顺序,所以你应该做的是比较每个字符,例如 cmp("abcd", "abce") 应该是 -1cmp("abce", "abcd")cmp("abe", "ab") 应该是 1

    int cmp(const char* string1, const char* string2) {
    
        do{
           if(*string1 > *string2){  //because of ASCII codes you can compare characters like this
               return 1;
           }
           if(*string1 < *string2){
               return -1;
           }      
        } while(*string1++ && *string2++); //while none of the chars is null
    
        return 0;  //reached if no different chars were found so the strings are equal
    }
    

    对于练习 2,您可以将数字提取到不同的容器中,对它们进行排序和比较:

    int function2 (const char * str){
    
        vector<int> digits; //dynamic container since the digit count is unknown at first
        int count = 0;
    
        for(size_t i = 0; i < strlen(str); i++)  //extract digits from string
            if(str[i] >= '0' && str[i] <= '9')
                 digits.push_back(str[i] - '0'); //add to digit container
    
        sort(digits.begin(), digits.end()); //sort digit vector
    
        for(size_t i = 0; i < digits.size() - 1; i++){ //compare digits and count if no repeat
            if(digits[i] != digits[i + 1] && digits[i + 1] != digits[i + 2]){
                count++;
            }
        }
        return count;
    }
    

    图书馆

    #include <cstring>
    #include <vector>
    #include <algorithm>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 2010-10-26
      • 2023-03-23
      • 1970-01-01
      • 2022-01-11
      • 2019-12-09
      相关资源
      最近更新 更多