Не получаете ошибки strcpy на Mac, а я на Windows? - PullRequest
0 голосов
/ 04 декабря 2009

- Все исправленные коды по-прежнему отказываются работать, пожалуйста, помогите -

Когда я компилирую свой код в Windows, я получаю ошибки памяти. Однако на Mac, где я изначально кодировал этот код, он работает нормально. Мне нужно, чтобы это работало в Windows.

Это как-то связано с тем, как я обрабатываю свои строки символов с помощью strcpy, с которым, похоже, Mac в порядке (я думаю, это связано с gcc и способом Microsoft).


Вот код для жалобщиков: main.cpp

#include "Cust.h"
using namespace std;

int main (int argc, char * const argv[]) {
    Cust customers[500];
    char tmpString[70] = " ";
    char * pch = new char[255];
    string tmpAcctFN = " ";
    string tmpAcctLN = " ";
    ifstream input("P3_custData.txt");
    for (int idx = 0; idx < 130; idx++){
        input.getline(tmpString, 70, '\n');
        strcpy(pch,strtok(tmpString," "),255);
        customers[idx].setAcctNum(pch);
        cout << pch << endl;
        strcpy(pch, strtok(NULL," "));;
        customers[idx].setAcctFN(pch);
        cout << pch << endl;
        strcpy(pch, strtok(NULL," "));;
        customers[idx].setAcctLN(pch);
        cout << pch << endl;
        strcpy(pch, strtok(NULL," "));;
        customers[idx].setCurrBalance(atol(pch));
        cout << pch << endl;
        strcpy(pch, strtok(NULL," "));;
        customers[idx].setPIN(atoi(pch));
        cout << pch << endl;
    }
    input.close();
    return 0;
}

Cust.h

/*
 *  Cust.h
 *  Project 3
 *
 *  Created by Anthony Glyadchenko on 11/17/09.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */
#include <iostream>
#include <string>

using namespace std;

#ifndef CUST_H
#define CUST_H

class Cust{
public:
    char * getAcctNum();
    void setAcctNum(char num[]);
    double getCurrBalance();
    void setCurrBalance(double balance);
    void addToCurrBalance(double amount);
    void subFromCurrBalance(double amount);
    void setAcctFN(char firstName[]);
    void setAcctLN(char lastName[]);
    char * getAcctFN();
    char * getAcctLN();
    void setPIN(int pin);
    int getPIN();

private:
    char acctNum[255];
    char acctFN[255];
    char acctLN[255];
    double currBalance;
    int pin;
    char fileName[255];
};
#endif

Cust.cpp

/*
 *  Cust.cpp
 *  Project 3
 *
 *  Created by Anthony Glyadchenko on 11/17/09.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */
#include <fstream>
#include <string>
#include <sstream>
#include "Cust.h"

using namespace std;

char * Cust::getAcctNum(){
    return acctNum;
}

void Cust::setAcctNum(char num[]){
    strcpy(acctNum,num);
}

double Cust::getCurrBalance(){
    return currBalance;
}

void Cust::setCurrBalance(double balance){
    currBalance = balance;
}

void Cust::addToCurrBalance(double amount){
    currBalance += amount;
}

void Cust::subFromCurrBalance(double amount){
    currBalance -= amount;
}

void Cust::setAcctFN(char firstName[]){
    strcpy(acctFN,firstName);
}

void Cust::setAcctLN(char lastName[]){
    strcpy(acctLN,lastName);

}

char * Cust::getAcctFN(){
    return acctFN;
}

char * Cust::getAcctLN(){
    return acctLN;
}

void Cust::setPIN(int pin){
    Cust::pin = pin;
}

int Cust::getPIN(){
    return pin;
}

Вот мой след стека:

 Index  Function
--------------------------------------------------------------------------------
 1      msvcr90d.dll!68d7f693() 
 2      [Frames below may be incorrect and/or missing, no symbols loaded for msvcr90d.dll]
*3      P3.exe!main(int argc=0, char * const * argv=0x0036fcd0) 
 4      P3.exe!_FreeLibrary@4() 
 5      P3.exe!@ILT+170(__except_handler4)() 
 6      kernel32.dll!75eb3677() 
 7      ntdll.dll!77b29d72() 
 8      ntdll.dll!77b29d45() 

Ответы [ 4 ]

4 голосов
/ 04 декабря 2009

Несколько вещей для проверки (извините, я не собираюсь скачивать код):

  1. есть ли в g ++ * .c предупреждения? Если так, то исправьте их.
  2. у g ++ -W есть предупреждения? Если так, то исправьте их.
  3. g ++ -W -У вас есть предупреждения? Если так, то исправьте их.
  4. g ++ -W -Wall -Wextra имеет предупреждения? Если так, то исправьте их.
  5. g ++ -W -Wall -Wextra -ansi имеет предупреждения? Если так, то исправьте их.
  6. Имеет ли g ++ -W -Wall -Wextra -ansi -pedantic предупреждения? Если так, то исправьте их.

В Microsoft попробуйте добавить / W4 в командную строку, чтобы включить предупреждение, снова исправьте все проблемы.

Скорее всего, вы делаете что-то "глупое", и есть вероятность, что компилятор поможет вам понять, что это такое.

Edit:

После компиляции кода с указанными выше флагами вы увидите:

Cust.h: 33: ошибка: ISO C ++ запрещает массив нулевого размера "acctNum" Cust.h: 34: ошибка: ISO C ++ запрещает массив нулевого размера "acctFN" Cust.h: 35: ошибка: ISO C ++ запрещает массив нулевого размера "acctLN" Cust.h: 38: ошибка: ISO C ++ запрещает массив нулевого размера «fileName» Cust.h: 33: ошибка: ISO C ++ запрещает массив нулевого размера "acctNum" Cust.h: 34: ошибка: ISO C ++ запрещает массив нулевого размера "acctFN" Cust.h: 35: ошибка: ISO C ++ запрещает массив нулевого размера "acctLN" Cust.h: 38: ошибка: ISO C ++ запрещает массив нулевого размера ‘fileName’

Таким образом, ваш код не является допустимым C ++. Вы копируете имя в слишком маленький массив - массив содержит 0 элементов. Что вам действительно нужно сделать, так это дать массивам размер, когда вы объявляете их или объявляете их как указатели, а затем используете «new» для выделения нужного количества памяти.

2 голосов
/ 04 декабря 2009
char acctNum[];
char acctFN[];
char acctLN[];

Вот твоя проблема. Кажется, вы никогда нигде не выделяете место для этих строк. Функция strcpy () в setAcctNum () выходит за границы этого неизменяемого массива и перезаписывает что-то еще. Удивительно, что это вообще компилируется.

Вместо этого вам, вероятно, следует использовать std :: string - по крайней мере, это упростит управление памятью.

2 голосов
/ 04 декабря 2009

Передача недопустимых буферов, слишком маленьких буферов и т. Д. Для strcpy приводит к неопределенному поведению - может случиться практически все. На Mac проблемы возникают, но они не очевидны, а на Windows это приводит к сбою.

0 голосов
/ 04 декабря 2009

Вероятно, это ваша реализация функции strcpy, которая может иметь различия между тем, как она кодируется на Mac, и тем, как она кодируется в Windows.

...