ARGV является char**
, указатель на указатель. Подумайте об этом как о массиве строк, а не о строках.
Индексирование [i]
удаляет один уровень косвенности, поэтому argv[i]
является указателем на символ, char*
.
toupper()
является int toupper (int c);
- он ожидает, что один символ как целое, а не указатель на символ, но вы передаете ему char*
, когда вы делаете argv[i]
, которые вы затем пытаетесь бросить к char
... A обычный старый символ, который обычно имеет разный размер для указателя.
argc
указывает, сколько аргументов командной строки есть, а argv[0]
обычно является вызывающим именем. Используйте strlen
, чтобы получить длину каждого аргумента в argv
.
Чтобы преобразовать весь каждый аргумент в верхний регистр:
for (int i = 0; i < argc; i++) {
size_t len = strlen(argv[i]);
for (size_t j = 0; j < len; j++) {
argv[i][j] = (char)toupper((unsigned char)argv[i][j]);
}
}
Вы можете прочитать о том, почему аргумент toupper()
должен быть приведен к unsigned char
in Keith Thompson's excellent answer elsewhere on SO
Какой части сообщения об ошибке не ясно? Или вы спрашиваете * почему * это ошибка, чтобы наложить указатель на целое число другого размера? – juanchopanza
Удалить явные приведения. Если вы все еще получаете сообщение об ошибке/предупреждении, вы делаете что-то неправильно. – Olaf
Вы пытаетесь сделать первую букву в верхнем регистре или целую строку? –