c++ - 为什么我的读取函数在第二次调用时会丢弃第一个字符?

标签 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 时,它会将“blabla”读入缓冲区。 (我通过 cout-for-loop 检查过)

当我想读取另一个数组(用于比较)并执行完全相同的操作returncode = read(second, MAX)时,它只会读取“labla”,其中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已经

最佳答案

你是在 Windows 还是基于 Unix 的系统上调用它?在 Unix 上它没有这个问题,所以它可能与以 Windows 结尾的不同行('\r\n' 与 '\n')和你使用

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

不确定这是否是问题所在,但请尝试用简单的代码替换该行

cin.ignore();

关于c++ - 为什么我的读取函数在第二次调用时会丢弃第一个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33994569/

相关文章:

c++ - "Set"C++中批量COM对象属性

java - 如何获取 json 文件中的每个 json 元素并将它们放入数组中

javascript - 关于 Javascript 数组 unique

PHP 数组无法正确从 php 文件中提取数据

c - 如何正确使用qsort()?

ios - Xcode 卡在从设备 tvOS 复制缓存文件

c++ - 如何根据参数从函数左值或右值返回?

c++ - 从二进制文件(进入类)读取 double - 小数不显示

c++ - 如何让一个 void 函数与 C++ 中的另一个 void 函数一起工作?

C++ 无序映射常量时间访问?