У меня есть следующий код, который я использую для нормализации массива символов. В конце процесса нормализованный файл имеет часть старого вывода, оставшегося в конце. Это нужно для того, чтобы i
достиг конца массива перед j
. В этом есть смысл, но как мне удалить лишние символы? Я исхожу из java, поэтому прошу прощения, если делаю ошибки, которые кажутся простыми. У меня такой код:
/* The normalize procedure normalizes a character array of size len
according to the following rules:
1) turn all upper case letters into lower case ones
2) turn any white-space character into a space character and,
shrink any n>1 consecutive whitespace characters to exactly 1 whitespace
When the procedure returns, the character array buf contains the newly
normalized string and the return value is the new length of the normalized string.
hint: you may want to use C library function isupper, isspace, tolower
do "man isupper"
*/
int
normalize(unsigned char *buf, /* The character array contains the string to be normalized*/
int len /* the size of the original character array */)
{
/* use a for loop to cycle through each character and the built in c funstions to analyze it */
int i = 0;
int j = 0;
int k = len;
if(isspace(buf[0])){
i++;
k--;
}
if(isspace(buf[len-1])){
i++;
k--;
}
for(i;i < len;i++){
if(islower(buf[i])) {
buf[j]=buf[i];
j++;
}
if(isupper(buf[i])) {
buf[j]=tolower(buf[i]);
j++;
}
if(isspace(buf[i]) && !isspace(buf[j-1])) {
buf[j]=' ';
j++;
}
if(isspace(buf[i]) && isspace(buf[i+1])){
i++;
k--;
}
}
return k;
}
Вот пример вывода:
halb mwqcnfuokuqhuhy ja mdqu nzskzkdkywqsfbs zwb lyvli HALB MwQcnfuOKuQhuhy Ja mDQU nZSkZkDkYWqsfBS ZWb lyVLi
Как видите, конец повторяется. В результате присутствуют как новые нормализованные данные, так и старые оставшиеся ненормализованные данные. Как я могу это исправить?
3 ответа
Добавить нулевой терминатор
k[newLength]='\0';
return k;
buf[j+1] = '\0'
. Это похоже на достижение цели, но добавляет дополнительный символ в конец массива (при распечатке в конце появляется X). Я неправильно добавил указатель?
buf[len]
в качестве терминатора. Адресный регион: buf[0...(len-1)]
. То, что длина была передана этой функции, не случайно. В назначении ничего не говорится о прекращении деятельности. Я искренне думаю, что проблема была в коде создания отчетов , а не в алгоритме (хотя, по общему признанию, я не рассматривал алгоритм внимательно). См. Мою ссылку в общем комментарии, чтобы понять, что я имею в виду.
dog
в буфер символов длиной 4. Существует существенная проблема завершение строки dog
в символьный буфер длиной 3 . Что эта функция может быть задана. char buf[3] = { 'd', 'o', 'g' }; normalize(buf,3);
в присвоении ничего не говорится о завершении строки, и все, что вы знаете о буфере, это то, что вам нужно обработать символы len
и вернуть количество символов после нормализация (которая все еще может быть len
). Честно говоря, не могу сказать яснее, чем это.
Исправить вот так
int normalize(unsigned char *buf, int len) {
int i, j;
for(j=i=0 ;i < len; ++i){
if(isupper(buf[i])) {
buf[j++]=tolower(buf[i]);
continue ;
}
if(isspace(buf[i])){
if(!j || j && buf[j-1] != ' ')
buf[j++]=' ';
continue ;
}
buf[j++] = buf[i];
}
buf[j] = '\0';
return j;
}
Или? добавить нулевой терминатор
k[newLength] = NULL;
return k;
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.