为什么我的读取功能会在第二次调用它时丢掉第一个字符?

时间:2015-11-30 08:48:20

标签: c++ arrays

我写了这个函数来从cin中读取一个char数组:

#include <iostream>
#include <stdlib.h>
#include <cstring>
#include "main.h"
int read (char* buffer, int size) {

//read from standart input (with whitespaces)
//cin >> buffer;
cin.get(buffer, size);
cin.ignore(1, '\n');
cout << "cin get buffer: " << buffer << endl;

//if not a correct input
if (!cin.good())
    return 0;

cout << "cin.good: " << cin.good() << endl;

//user wants to quit
if (!strcmp (buffer, "end"))
    return 0;

return 1;
}

当我第一次在我的主returncode = read (first, MAX)中调用此功能并输入blabla时,它会显示&#34; blabla&#34;进入缓冲区。 (我通过cout-for-loop检查)

当我想要读取另一个数组(用于比较),并执行完全相同的事情returncode = read(second, MAX)时,它只读取&#34; labla&#34;其中second[0]仍为空。

我的错在哪里?请随意询问其余代码,但我认为错误在此代码段中。

提前谢谢!

ps:我对c ++很陌生,所以请耐心等待我:) pps:这是大学考试,我们不允许使用字符串类..

编辑:一个简单的主要测试上面的

main.cpp中:

#include <iostream>
#include "main.h"
#define MAX 200
using namespace std;

int main () {
   char first [MAX] = {0};
   char second [MAX] = {0}; 

   cout<<"Please enter the first string to compare: "<<endl;
   returncode = read (first, MAX);
   cout<<"Please enter the second string to compare: "<<endl;
   returncode = read (second, MAX);

    switch (strcmp_ign_ws(first, second, MAX)) {
    case EQUAL:
       cout << "Strings are equal!" << endl;
       break;
    case SMALLER:
       cout << "String 1 is lexically smaller!" << endl;
       break;
    case BIGGER:
       cout << "String 1 ist lexically bigger!" << endl;
       break;
   }
}

和main.h:

#define EQUAL 0
#define SMALLER -1
#define BIGGER 1

int read (char*, int);
int strcmp_ign_ws (char*, char*, int);
int main ();

编辑2:添加字符串比较忽略空格函数

由于错误似乎不在读取函数中,因此这是第一个和第二个使用两个输入缓冲区的文件:

#include <stdlib.h>
#include <stdio.h>
#include <cstring>
#include <iostream>
#include <ctype.h>
#include "main.h"

using namespace std;

char * rm_ws (char * buffer, const int size) {

    int i,j;
    char *output=buffer;
    for (i = 0, j = 0; i<size; i++,j++)
    {
        if (buffer[i]!=' ')
            output[j]=buffer[i];
        else
            j--;
    }
    output[j]=0;
    return output;

}


int strcmp_ign_ws (char * first, char * second, int size) {
    first = rm_ws(first, size);
    second = rm_ws(second, size);


    if (strcmp (first, second) == 0)
        return EQUAL;
    if (strcmp (first, second) < 0)
        return SMALLER;
    if (strcmp (first, second) > 0)
         return BIGGER;

    }
}

ps:rm_ws函数已来自stackoverflow

2 个答案:

答案 0 :(得分:0)

你是在Windows或基于Unix的系统上调用它吗?在Unix上它没有那个问题,所以也许它与Windows中的不同行结束有关('\ r \ n'与'\ n')并且你使用

cin.ignore(1, '\n');

不确定这是否是问题,但只是尝试用简单的

替换该行
cin.ignore();

答案 1 :(得分:0)

经过几个小时的调试后,我终于得到了答案:

在我的for $subject in $subjects/subject return insert-child( <foo/>, $subject) 函数中出现了一个小错误:

而不是rm_ws,而不是output[j] = 0,就在return语句之前。

谢谢你的帮助!