C: код не работает без отдельной функции.Зачем? - PullRequest
0 голосов
/ 21 октября 2018

Я в основном создаю небольшой метод / функцию, которая обрезает строку, если ее длина больше, чем ввод new_line.Тем не менее, у меня есть две разные версии этого.

Первый код вычисляет длину строки и сокращает ее все по одному и тому же методу / функции.

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

Первый код не работает (он не обрезает строку), а второй работает.Хотя я не знаю почему.Спасибо

Код, который не работает

void shorten(char *s, int new_len){
    int len = 0;
    while(*s){
        len++;
        s++;
    }
    while( len > new_len){
        s[len - 1] = '\0';
        s--;
        len--;
    }
}

Код, который работает

int length(char *s){ // count length of string
    int len = 0;
    while(*s){
        len++;
        s++;
    }
    return len;
}

void shorten(char *s, int new_len) {
    int len = length(s);
    while( len > new_len){
        s[len - 1] = '\0';
        s--; // move to previous char
        len--; // decrease length
    }
}

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Что вам нужно сделать, это , а не , увеличивать указатель s при расчете длины.Кроме того, вы можете избежать цикла while для сброса длины, просто установив s[new_len] = '\0', если len > new_len.

Кроме того, поскольку strlen() возвращает длину типа size_t, рекомендуется использовать size_t для хранения длины строки символа (это может устранить любые предупреждения, связанные со сравнением значений со знаком и без знака).

void shorten(char *s, size_t new_len) {
    size_t len = 0;
    while (s[len] != '\0') {
        len++;
    }
    /*while ( len > new_len) {
        s[len - 1] = '\0';
        len--;
    }*/
    if (len > new_len) {
        s[new_len] = '\0';
        len = new_len;
    }
}
0 голосов
/ 21 октября 2018

Вы изменяете аргумент функции, выполняя s++;, который после первого цикла больше не указывает на начало строки.Возможно, вы хотели сделать это:

void shorten(char *s, int new_len){
    int len = 0;
    while(*s){
        len++;
        s++;
    }
    while( len > new_len){
        s--;
        len--;
        *s = '\0';
    }
}

Также рекомендуется использовать size_t для всех операций, связанных с размером / длиной / индексом.

...