输出错误:计算字符串

时间:2014-02-11 05:01:45

标签: c++ string-length

#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

为什么?

5 个答案:

答案 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>