C:如果没有单独的功能,代码将无法正常工作。为什么?

时间:2018-10-21 05:11:49

标签: c string function pointers methods

我基本上是在创建一个小的方法/函数,如果它的长度比输入的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 :(得分:2)

您正在通过执行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

答案 1 :(得分:0)

您需要做的是在计算长度时不增加s指针。另外,只要设置s[new_len] = '\0'如果len > new_len,就可以避免while循环重设长度。

此外,由于strlen()返回类型为size_t的长度,建议使用size_t来存储char字符串的长度(它可以消除与有符号和负号之间的比较有关的任何警告。无符号值)。

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;
    }
}