2016-11-05 4 views
0

У меня есть проблема с функцией tolower. Пытался использовать его с argv, но выход был $ 0 @. Что случилось с моим кодом?Неверный выход из функции tolower

#include <stdlib.h> 
#include <stdio.h> 

void makeLower(char *s) { 
    int i; 
    for(i = 0; s[i] != '\0'; i++){ 
     s[i] = tolower(s[i]); 
     } 
     printf("%s", s); 
} 

int main(int argc, char *argv[]) { 
    argv[0]="A"; 

    makeLower(argv); 
    return 0; 
} 
+2

Вы не можете надежно записать строковые литералы; вы вызываете неопределенное поведение, когда вы это делаете. Измените 'main()' на 'int main (void) {char str [] =" A "; MakeLower (ул); return 0; } 'например. Вы должны добавить новую строку в 'printf()'; вероятно, вы должны напечатать в функции 'main()', а не в функции полезности (не более общего назначения). Технически вы должны передать 'int', содержащий либо' unsigned char', либо EOF для 'tolower()' (обычно достигаемый 'tolower ((unsigned char) s [i])'). Однако вы не столкнетесь с проблемой с 'A'. –

+1

Возможно, ваше недоразумение заключается в том, что вы пытаетесь присвоить что-то 'argv [0]'. Предполагается, что они содержат информацию из вашей среды, в частности 'argv [0]' должно быть именем вашей скомпилированной программы. Если вы просто запустили его без присвоения '' A '', все должно работать тогда отлично, строки, которые 'argv' указывает на изменяемые. –

ответ

0

argv является указателем на указатель, который является char**. Но функция принимает char*. Итак, вам нужно пройти как:

makeLower(argv[0]); 

Но это не будет работать, потому что argv[0] теперь указывает на строковой литерал. Изменение строкового литерала - undefined.

Вместо пройти изменяемый массив, как:

int main(int argc, char *argv[]) { 
    char arr[] = "A"; 

    makeLower(arr); 
    return 0; 
} 

Другой вариант, чтобы сделать копию строкового литерала передается (через argv[0]), и тогда вы сможете изменить его. В принципе, идея состоит в том, что вы не можете юридически модифицировать строковые литералы в C.

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