Почему этот код не копирует две строки, работающие в C? - PullRequest
0 голосов
/ 06 ноября 2010
#include <stdlib.h>

main()
{
    char string[23] = "2345,";

    char aString [sizeof string];

    int i = 0;

    while((aString[i] = string[i]) != ',')
        ++i;

    char *ts = aString;

    printf("%s\n", aString);
}

Я хочу скопировать все, кроме запятой, из строки в aString.Тем не менее, это не работает - у меня распечатывается строка с запятой и мусором в конце.Может кто-нибудь сказать мне, что я делаю здесь не так?

Хорошо, это сработало.Однако, я получаю эту ошибку после компиляции:

предупреждение: несовместимое неявное объявление встроенной функции 'printf'

Насколько я могу судить, я не делаю ничего плохогоPrintf.Так может кто-нибудь сказать мне, что происходит?

Ответы [ 5 ]

6 голосов
/ 06 ноября 2010

Вам нужно добавить aString[i]=0 один раз после цикла while, строки C завершаются 0.

1 голос
/ 06 ноября 2010

вы используете цикл while while((aString[i]=String[i])!=',')++i; в котором = имеет больший приоритет, чем !=, поэтому сначала он копирует символ из String[i] в aString[i], затем проверяет условие, т.е. почему это происходит .......

1 голос
/ 06 ноября 2010
while((aString[i] = string[i]) != ',')
++i;

aString[i] = '\0';
1 голос
/ 06 ноября 2010

В конце строки есть «невидимый» нулевой байт, который вы не копируете. Вот как такие функции, как printf, знают, где находится конец вашей строки. Без этого printf будет запускаться с конца вашей строки и продолжит печатать, какие символы следуют за памятью, в которой хранится ваша строка.

В C и C ++ все строки должны заканчиваться нулем таким образом.

Если вы собираетесь копировать только часть строки, вам нужно вручную добавить нулевой байт в конец:

while((aString[i] = string[i]) != ',')
    ++i;

string[i] = '\0';    
0 голосов
/ 06 ноября 2010

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

#include <stdlib.h>

main()
{
    char string[23] = "2345,";

    int buflen = sizeof(string);

    char aString [buflen+1];

    int i = 0;

    while(i < buflen && (aString[i] = string[i]) != ',')
        ++i;

    aString[i] = '\0';

    char *ts = aString;

    printf("%s\n", aString);
}

Вы, вероятно, уже знаете это, но обычно вы просто используете strncpy вместо написания своего кода для этого.

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