【问题标题】:Using Pointers to pass C-String arguments使用指针传递 C-String 参数
【发布时间】:2013-02-12 02:58:06
【问题描述】:

我整天都被这个程序卡住了。我终于觉得我真的很接近了。我必须找到字符串中元音和字符的数量。然后在最后输出它们。但是,当我编译我的程序时崩溃了。我检查了语法,整天都在看我的书。如果有人可以提供帮助,我将不胜感激!因为我还有 5 个类似的函数要编写来操作 c 字符串。谢谢!

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

int specialCounter(char *, int &);


int main()
{

const int SIZE = 51;        //Array size
char userString[SIZE];      // To hold the string
char letter;
int numCons;



// Get the user's input string
cout << "First, Please enter a string (up to 50 characters): " << endl;
cin.getline(userString, SIZE);





// Display output
cout << "The number of vowels found is " << specialCounter(userString, numCons) <<      "." << endl;
cout << "The number of consonants found is " << numCons << "." << endl;


}



int specialCounter(char *strPtr, int &cons)
{
int vowels = 0;
cons = 0;


while (*strPtr != '/0')
{
    if (*strPtr == 'a' || 'A' || 'e' || 'E' || 'i' || 'I' || 'o' || 'O' || 'u' || 'U')
    {
        vowels++;       // if vowel is found, increment vowel counter
                    // go to the next character in the string
    }
    else
    {
        cons++;         // if consonant is found, increment consonant counter
                    // go to the next character in the string
    }

    strPtr++;

}
return vowels;

}

【问题讨论】:

  • *strPtr == 'a' || 'A' || 'e' || 'E' || 'i' || 'I' || 'o' || 'O' || 'u' || 'U' 将始终为真,因为'A' 不为 0。
  • 我不确定我是否理解,因为在检查“/0”时,空终止符。
  • 您是否正在从该表达式中寻找任何特定的bool 条件?提示:*strPtr == 'a' || *strPtr == 'A' || *strPtr == 'e'.....。完成所有输入后,将其扔掉,将所有测试字符放入单个字符串常量 (const char vowels[] = "aAeEiIoOuU";) 并将表达式更改为 if (strchr(vowels, *strPtr))
  • 哦。好的,所以我不应该使用 or ||因为它搜索所有的元音?喜欢为每个字符使用 switch 语句吗?
  • @user2063325,就我个人而言,我会使用std::count_if,但这可能是不允许的。请参阅我的答案,了解与多个条件进行比较的正确方法。

标签: c++ function pointers arguments c-strings


【解决方案1】:

我将假设您仅限于不使用 std::string 或 std::getline,并且您必须假设用户输入的内容少于 51 个字符。

您的崩溃源于:

while (*strPtr != '/0')

空字符是转义码。 '/0' 是具有实现定义值的多字符文字。这意味着它可能总是正确的。将其更改为:

while (*strPtr != '\0') //or while (strPtr)

除此之外,您的元音检查存在逻辑错误。您必须对照每个元音检查它,如下所示:

if (*strPtr == 'a' || *strPtr == 'e') //etc.

如果您与每个字符的 toupper 或 tolower 版本进行比较,将比较次数减少 2 倍,您会发现会更容易。

【讨论】:

    【解决方案2】:
    while (*strPtr != '/0')
    

    应该是:

    while (*strPtr != 0)
    

    或

    while (*strPtr != '\0');
    

    你的编译器没有给你一个警告吗?如果是这样,请不要忽略警告。如果没有,请使用更好的编译器。

    另请参阅 cmets,了解其他比较中的错误。

    【讨论】:

    • 是的,它没有给我警告。 :/。我不敢相信我的斜线走错了方向。非常感谢!
    【解决方案3】:

    其他答案应该可以解决您的问题,我可以建议您编写单独的函数而不是一个全能的函数吗?

    bool IsSpecialChar(char c)
    {
     switch(c)
     {
        case 'a':
        case 'A':
        case 'e':
        case 'E':
        case 'i':
        case 'I':
        case 'o':
        case 'O':
        case 'u':
        case 'U':
        return true;
     }
       return false; 
    }
    
    
    int specialCounter(char *strPtr, int &cons)
    {
      int vowels = 0;
      cons = 0;
      while (*strPtr != '\0')
      {
        IsSpecialChar(*strPtr) ? vowels++ : cons++;
        strPtr++;
    
      }
      return vowels;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多