проблема с argv, новая для c - PullRequest
       0

проблема с argv, новая для c

2 голосов
/ 23 декабря 2010

У меня проблемы с argv.

meltcheck(argv[1]);

Функция:

int meltcheck(char a[])
{
        if(a != "a" && a != NULL)
        {
                char dir[600];
                strcpy(dir, "del ");
                strncat(dir, a, sizeof(a));
                dir[strlen(dir)] = '\0';
                printf("\ndtmeltcheck: %s\n", dir);
                //system(dir);
        }

        return 0;
}

Извините, код испортился, когда я попытался вставить его.Но проблема в том, что argv хранит только 4 символа, даже если строка> 4 символов.Почему это происходит?

Ответы [ 4 ]

3 голосов
/ 23 декабря 2010

Здесь есть ряд проблем.Во-первых, вы не можете сравнивать содержимое строк, используя == или != в C - который сравнивает значения указателя, поэтому a != "a" всегда будет TRUE.Кроме того, dir[strlen(dir)] всегда равно '\0' по определению.И sizeof(a) - это размер char * (т.е. 4), а не длина данных.

Ваша функция должна выглядеть примерно так:

1 голос
/ 23 декабря 2010

Вы не можете использовать sizeof таким образом для массивов, переданных в качестве параметров функциям.

Причина в том, что при передаче массива в функцию в C, массив превращается в указатель на свой первый элемент. В результате, когда вы берете sizeof(a), вы получаете размер указателя, а не размер массива. В этом случае это то же самое, что и sizeof(char *), что на 32-разрядной машине будет 4, как вы заметили.

Вы также используете strncat так, как это не было задумано. Смысл третьего параметра - предотвратить переполнение буфера, если strlen(a) длиннее, чем объем пространства в буфере, в который вы копируете, в данном случае dir. Я думаю, что вы хотите:

strncat(dir, a, 595); /** 600 - "dir " - \0 = 595 */

Поскольку в dir есть место для еще 595 символов.

Также обратите внимание, что вы не можете сравнивать строки C, используя !=. Ваше заявление if должно использовать strcmp вместо.

0 голосов
/ 23 декабря 2010

Используйте strlen вместо sizeof. Размер указателя будет равен 4 на 32-битной платформе.

0 голосов
/ 23 декабря 2010

Я думаю, проблема в том, что sizeof (a) будет возвращать sizeof (char *) (размер poitner для символа), а не длину строки символов a.Так что это только копирование четырех символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...