【问题标题】:Input of character streams字符流的输入
【发布时间】:2015-12-07 12:34:22
【问题描述】:

我正在尝试输入字符流,但我得到了奇怪的结果。

我正在尝试计算每行中a'sb's 的数量。

输入格式如下。

第一行包含测试用例的数量(t)

第二行包含(n) 的行数。

接下来的n 行包含n 输入字符流。

这里是代码 sn-p。

int t;
    cin>>t;

    while(t--)
    {
        int n;
        cin>>n;

        char ch;
        int arr[n][2]={};

        for(int i=0; i<n; i++)
        {



            while((ch != '\n'))
            {
                ch=getchar();

                if(ch == 'a')
                {
                    arr[i][0]++;
                }

                else if(ch == 'b')
                {
                    arr[i][1]++;
                }


            }


            cout<<arr[i][0]<<"\t"<<arr[i][1]<<endl;
        }

我给出以下输入:

1

3

ab

ba

aa

我得到以下输出:

0   0

1   1

1   1

但我的预期输出是:

1   1

1   1

2   0

看起来i=0 会出现一个额外的'\n',它会将输出移动一个'i'。我该如何解决这个问题?

【问题讨论】:

  • 这是 C 和 C++ 的糟糕组合。你认为你为scanf 输入的换行符会发生什么?而且 C++ 没有变长数组(您将 arr 声明为变长数组),一些编译器将其作为扩展。
  • @JoachimPileborg :即使使用 cin>>n 也不起作用。我将编辑问题以避免这些答案。
  • scanf 的问题相同,您认为输入中的换行符会发生什么?尝试在调试器中逐行执行代码,看看getchar 实际返回什么。
  • 哦,你有未定义的行为,因为你在初始化之前使用了ch。未初始化的非静态局部变量有一个indeterminate值,你需要在使用它们之前对其进行初始化。
  • 我可以使用 scanf("%s",&mystr) 创建一个工作代码并运行循环,直到遇到 '\0'。

标签: c++ string character


【解决方案1】:

您的char ch; 定义了一个字符,但没有对其进行初始化,因此其内容不可预测。

然后你在while((ch != '\n')) 中使用它,但ch 在第一步仍然没有初始化(当i=0 时),这不是一个好习惯。

你应该试试

for (...) {

  do {

    ch = getchar();

    <check content of 'ch'>

  } while (ch != '\n');

}

for (...) {

  ch = getchar();

  while (ch != '\n') {

    <check content of 'ch'>

    ch = getchar();

  }
}

【讨论】:

  • 它不起作用,(至少在 ideone.com 上)。看起来缓冲区中有一个“\n”正在干扰。
  • 在每次调用getchar 后尝试cout &lt;&lt; (char) ch &lt;&lt; endl;,看看会打印哪个意外字符。
【解决方案2】:

要在读取行数时从输入流中删除行尾,我建议使用

scanf("%d\n",&n);

正如@A 所提到的。 Gille,您还应该在将 ch 与任何内容进行比较之前对其进行初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 2013-09-24
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    相关资源
    最近更新 更多