Вопрос

Я создал программу под названием test:

#include<stdlib.h>
#include<iostream>
int main()
{
    std::cout<<system("..\\add\\debug\\add.exe 4 8");
    while(true);
    return 0;
}

add.exe состоит из

#include<stdlib.h>
int main(int argc,char **argv[])
{
    int n=((unsigned)argv[1]);
    int m=((unsigned)argv[2]);
    return(n+m);
}

поэтому, когда я запускаю тест, я получаю

6841420

Попытка состояла в том, чтобы запустить тест add с параметрами 4 и 8, а для add вернуть сумму этих значений (12), а затем test отобразил бы это на экране.Как я получил 6841420 и как я могу это исправить?

Это было полезно?

Решение

Проблема в том, что вы преобразуете значение указателя в целое число.Аргументы будут переданы вашей программе в виде строк в стиле C (const char*).Сначала вам нужно преобразовать их в строку, используя API, подобный atoi.

#include<stdlib.h>
int main(int argc,char *argv[])
{
    int n= atoi(argv[1]);
    int m= atoi(argv[2]);
    return(n+m);
}

Редактировать

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

Другие советы

Ваш add.exe приводит указатели на строки к беззнаковым целым числам, поэтому он добавляет их позиции в памяти, а не числа.

Используйте sscanf (или, как предложено в другом ответе, atoi - это, вероятно, проще).

Это может быть нормально как игрушка, но, к вашему сведению, вы не можете рассчитывать на то, что сможете вернуть полный диапазон целых чисел из main().Во-первых, system() использует различные значения в качестве контрольных (например, -1 и 127), поэтому вы не сможете определить разницу между неудачным выполнением и законным результатом одного из этих значений.Во-вторых, оболочки могут ограничить диапазон возвращаемого значения только 8 битами (используя оставшиеся биты для дополнительной информации о состоянии).

Ответы об использовании atoi() или sscanf() для преобразования элементов argv[] из строк в фактические целые числа попадают в точку.

Однако в вашем тестовом примере есть еще одна проблема.Возвращаемое значение system() является статусом завершения для запущенного процесса, который более чем немного зависит от платформы.Однако на большинстве платформ все устроено так, что ценность 0 означает, что команда выполнилась нормально и в конечном итоге вызвала exit(0) сама по себе.Windows в значительной степени соответствует этим требованиям.

Линия cout<<system(...) выводит это значение статуса.На многих платформах (особенно совместимых с POSIX), если процесс выполнялся без аварийного завершения, младший байт кода состояния будет равен нулю, а старшим байтом будет значение, переданное exit() предполагая, что это значение равно 255 или меньше.

На самом деле использование статуса завершения для передачи родительскому процессу гораздо большего объема информации, чем просто успех / неудача, сильно зависит от платформы, и есть гораздо лучшие способы сделать это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top