2015-07-12 6 views
-3

Когда я пытаюсь использовать toupper, компилятор дает мне эту ошибку: «warning: cast from pointer to integer разного размера». и «warning: присваивание делает указатель из целого без приведения». Зачем?лить из указателя в целое число разного размера. compile error

for(i=0;i<argc;i++){ 
    argv[i]=(char)toupper((char)argv[i]); 
} 
+0

Какой части сообщения об ошибке не ясно? Или вы спрашиваете * почему * это ошибка, чтобы наложить указатель на целое число другого размера? – juanchopanza

+0

Удалить явные приведения. Если вы все еще получаете сообщение об ошибке/предупреждении, вы делаете что-то неправильно. – Olaf

+0

Вы пытаетесь сделать первую букву в верхнем регистре или целую строку? –

ответ

5

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 charin Keith Thompson's excellent answer elsewhere on SO

+1

Аргумент 'toupper' должен быть передан' unsigned char', а не 'int'. –

+0

несут со мной .. Я новичок в C, но как argv [i] [j] возможно, когда он был инициализирован только одним измерением? Кроме того, это скомпилировано, однако, когда я запускал программу и дал ей «abcdefg», программа вернула «?»? –

+0

@RickyYang Что заставляет вас думать, что 'argv' был инициализирован только одним измерением? 'argc' - это длина одного измерения, по существу, но каждый' char * 'в' argv' имеет разную длину в зависимости от аргументов командной строки, которые вы передаете. –