#include <iostream>
#include <cstring>
using namespace std;
int main() {
char a[10001],b[10001];
int tot,s1,s2;
cin>>tot;
while(tot!=0) {
gets(a);
gets(b);
s1= strlen(a);
s2= strlen(b);
cout<<s1<<s2<<endl;
tot--;
s1=0;
s2=0;
}
}
这是一个程序,用于查找两个字符串的长度,并输入了大小写 输入:
4
abcd
xyz
abcd
bcda
aabc
acaa
Codechef
elfedcc
预期输出
43
44
44
87
但输出
04
34
44
48
为什么?
答案 0 :(得分:2)
如评论中所述,编译器正在惩罚您使用gets
1 。我不会写一个实际的答案,但你得到的答案似乎是试图掩盖代码的问题,而不是实际修复任何东西。
首先:从不使用gets
。没有办法安全地使用它,也没有任何借口甚至尝试。它只是一个设计糟糕的功能,如果它从未存在过,我们都会变得更好。
其次,在C ++中,几乎从来没有充分理由将char
数组用于字符串。 strlen
几乎是一样的。这些并不像gets
那样危险或可怕,但在C ++中使用它们的真正原因(在极其有限的嵌入式系统之外)是非常罕见的,直到你知道你在做什么以及为什么,它可能是最好的忘记它们甚至存在。
当你处于这种状态时,在这样的情况下使用while
循环(倒计时,不能少)主要是对代码进行模糊处理而不获得任何回报。就此而言,使用tot
等变量名称代替(例如)total
或(更好)pair_count
也是一种愚蠢的行为。
所以,对于你不应该做什么,我已经夸大了,我会建议什么呢?首先,如果您要使用stream >> var
类型输入,请尝试一致地使用它。如果您要读取行,请尝试一致地执行此操作。在这种情况下,您可以使用其中任何一个,但将两个引线混合到您现在遇到的问题中。因此,如果可以的话,最好避开整个区域(而且你几乎总是可以)。
为此,我一直使用>>
,使用std::string
来保存字符串,使用for
循环来执行固定数量的迭代:
int word_count;
std::cin >> pair_count;
for (int i=0; i<pair_count; i++) {
std::string a, b;
std::cin >> a >> b;
std::cout << a.size() << b.size() << '\n';
}
与您获得的其他建议不同,这是类型安全(scanf
,公司甚至不尝试),不受缓冲区溢出的影响(gets
永远不会,而{{1}和公司可以,他们不是在使用,因为其他答案已推荐)。它还更短更简单,无需添加大部分无法解释的补丁来掩盖代码中的实际问题。
如果前面的声音很刺耳,我为此道歉。不幸的是,这有时候只是为了得到重点,至少在我看来,这似乎就是其中之一。
<子> 1.第0条诫命:你不能使用获取。如果你这样做,你肯定会死(但不是每个维护你的代码的人都希望你死)。 子>
答案 1 :(得分:2)
您应该尝试使用标准模板库来处理字符串:
std::string a, b;
int numberToAsk = 0;
cin >> numberToAsk;
while(numberToAsk!=0) {
cin >> a >> b;
cout << a.size() << ", " << b.size() << endl;
--numberToAsk;
}
(同时确保使用std::vector
代替普通数组!)
此外,您可以通过检查标准输入是否仍然可以避免需要提前查询条目数;一旦结束输入流,你的程序就会结束(例如,在Windows上 ctrl + z 或 F6 ,或 ctrl + d :
while(cin >> a >> b) {
cout << a.size() << ", " << b.size() << endl;
}
答案 2 :(得分:1)
cin>>tot;
此代码不使用'\ n'字符。所以第一个调用读取“4”和“\ n”之间的行。要查看它,您可以尝试输入
4abcd
xyz
abcd
bcda
aabc
acaa
Codechef
elfedcc
答案 3 :(得分:0)
将cin更改为scanf工作
#include <iostream>
#include <cstring>
#include <stdio.h>
using namespace std;
int main() {
char a[10001],b[10001];
int tot,s1,s2;
scanf("%d\n",&tot);
while(tot!=0) {
gets(a);
gets(b);
s1= strlen(a);
s2= strlen(b);
cout<<s1<<s2<<endl;
tot--;
s1=0;
s2=0;
}
}
答案 4 :(得分:-2)
这样做
scanf("%d ",%t);
参加没有。投入该空格避免输入由第一个字符串输入的数字输入后输入的'\ n'字符。其余的代码可以按原样完成。
您需要包含cstdio标头。 #include<cstdio>