您的第一个 if永远不会为真,因为您的 for 循环中的 i < strlen(myString)。
只需将myString[j] = 0; 放在函数底部即可。
但是,在for 的条件部分使用strlen 会将运行时间从 O(n) 增加到 O(n^2)。
最好只针对 0 (EOS) 测试当前输入字符。
但是,当您省略 !##! 时,您会保留一个额外的空格字符,因此您需要一些额外的代码。
以下是一些重构代码,显示了函数的四个版本及其输出:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DOFNC(_fnc) \
dofnc(str,_fnc,#_fnc)
void
convertlower(char myString[])
{
int i = 0,
j = 0;
for (i = 0; i < strlen(myString); i++) {
if (myString[i] == '\0') {
myString[j] = '\0';
break;
}
if ((myString[i] >= 'A' && myString[i] <= 'Z') ||
(myString[i] >= 'a' && myString[i] <= 'z') ||
(myString[i] == ' ')) {
if (myString[i] >= 'A' && myString[i] <= 'Z') {
myString[j] = myString[i] + 32;
j++;
}
else {
myString[j] = myString[i];
j++;
}
}
}
}
void
convert2(char myString[])
{
int i = 0,
j = 0;
for (i = 0; i < strlen(myString); i++) {
if ((myString[i] >= 'A' && myString[i] <= 'Z') ||
(myString[i] >= 'a' && myString[i] <= 'z') ||
(myString[i] == ' ')) {
if (myString[i] >= 'A' && myString[i] <= 'Z') {
myString[j] = myString[i] + 32;
j++;
}
else {
myString[j] = myString[i];
j++;
}
}
}
myString[j] = 0;
}
void
convert3(char myString[])
{
const char *src = myString;
char *dst = myString;
for (int chr = *src++; chr != 0; chr = *src++) {
if (chr >= 'A' && chr <= 'Z') {
*dst++ = chr + 32;
continue;
}
if ((chr >= 'a' && chr <= 'z') || (chr == ' ')) {
*dst++ = chr;
continue;
}
}
*dst = 0;
}
void
convert4(char myString[])
{
const char *src = myString;
char *dst = myString;
int last = -1;
for (int chr = *src++; chr != 0; chr = *src++) {
if (chr >= 'A' && chr <= 'Z') {
last = chr + 32;
*dst++ = last;
continue;
}
if (chr >= 'a' && chr <= 'z') {
last = chr;
*dst++ = chr;
continue;
}
if (chr == ' ') {
if (last == chr)
continue;
last = chr;
*dst++ = chr;
continue;
}
}
*dst = 0;
}
void
dofnc(const char *str,void (*fnc)(char myString[]),const char *who)
{
char *obuf = malloc(strlen(str) + 10);
strcpy(obuf,str);
fnc(obuf);
printf("\n");
printf("dofnc: %s\n",who);
printf("'%s'\n",obuf);
free(obuf);
}
void
dotst(const char *str)
{
printf("dotst:\n");
printf("'%s'\n",str);
DOFNC(convertlower);
DOFNC(convert2);
DOFNC(convert3);
DOFNC(convert4);
}
int
main(void)
{
//dotst("The quick Brown Fox jumps over the Lazy Dog and the !##! LAZY DOG is still sleeping");
dotst("The Brown Fox jumps over the Lazy Dog and the !##! LAZY DOG is still sleeping");
return 0;
}
这是程序输出:
dotst:
'The Brown Fox jumps over the Lazy Dog and the !##! LAZY DOG is still sleeping'
dofnc: convertlower
'the brown fox jumps over the lazy dog and the lazy dog is still sleepingping'
dofnc: convert2
'the brown fox jumps over the lazy dog and the lazy dog is still sleeping'
dofnc: convert3
'the brown fox jumps over the lazy dog and the lazy dog is still sleeping'
dofnc: convert4
'the brown fox jumps over the lazy dog and the lazy dog is still sleeping'