2016-12-09 3 views
0

Я хочу прочитать файл и посчитать слова. Я хочу, чтобы он был настроен, поэтому я могу использовать командную строку или, если в командной строке не указан файл, чтобы вызвать оператор if, который получит имя файла и прочитает его, а затем подсчитайте слова. Он работает, если я набираю имя файла в командной строке, но если он не используется, это приведет к ошибкам seg. Вот код:Почему я получаю seg-ошибку с моим заявлением if?

int main(int argc, char **argv) 
{ 
    char file[75]; 
    if (argc < 2) 
    { 
     cout << "Please enter the filename: "; 
     cin >> file; 
     strcpy(argv[1], file); 
    } 
    string content; 
    ifstream inFile(argv[1]); 
    int count = 0; 
    while (inFile >> content) 
     count++; 
    inFile.close(); 
    display(count, argv); 
    return 0; 
} 
+4

Это UB: 'зЬгср (ARGV [1], файл) ; ' – drescherjm

+6

Если' argc' меньше 2, то каковы действительные индексы для 'argv'? – NathanOliver

+0

Пробовал ли вы использовать отладчик для взлома кода после его сегментации? Что это вам сказал? Обучение использованию отладчика - очень хорошая практика. Вы должны попробовать это, даже после того, как вы получите ответ здесь, чтобы убедиться, что вы видите, как вы могли бы понять это для себя в будущем. –

ответ

1

Если условие истинно, то есть если argc на самом деле меньше, чем 2, то в общем случае argc равно 1, и в соответствии с C Стандарт argv[argc] равен NULL.

Таким образом, программа в этом случае имеет неопределенное поведение.

В любом случае, это плохая идея скопировать строку в argv [n], где n - некоторый индекс, потому что исходная строка может быть больше целевой строки.

Вы можете использовать обратный подход, который должен скопировать argv[1] в file.

3

Вы не должны изменять данные argv, особенно за пределами границ. Вы логика должна работать наоборот:

char file[75]; 
    if (argc < 2) 
    { 
     cout << "Please enter the filename: "; 
     cin >> file; 
    } else 
     strcpy(file, argv[1]); 
    string content; 
    ifstream inFile(file); 

но лучше использовать std::string для переменной file, а также.

Также cin >> входов только слова (за исключением космических символов), но имена файлы могут иметь их, так что лучше использовать cin.getline(file) или std::getline(cin, file), если вы измените file на std::string

+0

Это исправлено! Спасибо!! – Ryu

Смежные вопросы