2
#include<iostream>
#include<cstdio>
using namespace std;

int main()
{
    int T;
    char J[100], S[100];
    int count=0;
    cin >> T;

    while(T--)
    {
        cin.getline(J,100);

        cin.getline(S,100);
        puts(J);
        puts(S);

        for(int i=0; J[i]!='\0'; i++)
        {
            for(int j=0; S[j]!='\0'; j++)
            {
                count++;
                for(int k=j; S[k]!='\0'; k++)
                    S[k]=S[k+1];
                break;
            }
         }
         cout << count;
    }
    return 0;
}

我在 J,S 中获取输入字符串,但在执行程序期间它会跳过来自控制台 cin.getline 的第二个输入

4

3 回答 3

1

您需要使用字符串、std::string 并调用 getline,如

std::string s,j;
std::getline(std::cin,j);
std::getline(std::cin,s);

然后如果你想通过单个字符迭代字符串的内容

for(auto i = std::begin(s); i != std::end(s); ++i)
{
     std::cout << *i << std::endl;
}

使用迭代器,并尊重它们以获得实际的字符值。尽可能远离 c 字符串。

于 2012-05-09T03:51:20.440 回答
1

这段代码:

int T;
// ...
cin>>T;

int...从标准输入中读取一个。要让它读取它int,您需要按下enter键,但此代码不会enter输入缓冲区中删除它。然后...

cin.getline(J,100);

这会尝试从输入缓冲区读取字符串,直到第一个换行符。它从输入缓冲区中删除该换行符,但不将其作为字符串的一部分。因此,如果您不仔细观察,它似乎基本上什么也没做——即,您最终得到一个空字符串。

您通常希望坚持使用面向字段的输入(例如您的或面向cin >> T;行的输入(我错了:它可以工作——并且在这方面工作得很好,但你需要知道你在做什么,即使那样,它仍然会时不时地让你感到惊讶。getlinegetline

正如我的评论(和@johnathon 的回答)中所指出的,您通常还希望用来std::getline读取一个std::string, 而不是std::cin.getline一个 char 数组。后者处理起来很笨拙,即使充其量也是如此。

如果您要在任何地方使用它,我自己的偏好是(通常)在整个过程中使用面向行的输入。

std::string temp;

std::getline(std::cin, temp);

int T = lexical_cast<int>(temp);

while (T--) {
   std::string j;

   std::getline(std::cin, j);

   // ...

顺便说一句,我也避免T在 C++ 中用作普通变量的名称。它通常用作模板参数的名称;将它用于“正常”变量更容易导致混淆,尤其是对于更频繁使用模板的高级程序员。

于 2012-05-09T04:12:58.817 回答
0

(1) 在 cin>>T 和 while (T--) 之间使用 getchar() 作为

int T;
char J[100] , S[100];
int count=0;
cin>>T;
getchar();
while(T--){
cin.getline(J,100);
cin.getline(S,100);

(2)。您也可以通过以下方式解决您的问题:

char  T[10];
char J[100] , S[100];
int count=0;
getline(T,10);

while((atoi(T))--){

cin.getline(J,100);

cin.getline(S,100);

使用其中任何一个,它将解决您的问题。

于 2012-05-09T06:54:15.477 回答