【发布时间】:2015-12-07 12:34:22
【问题描述】:
我正在尝试输入字符流,但我得到了奇怪的结果。
我正在尝试计算每行中a's 和b'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'。