我基本上是在创建一个小的方法/函数,如果它的长度比输入的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
}
}
答案 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;
}
}