使用strtok()
并不是显而易见的方法。
void read_RemoveSpace(char *str)
{
char *dst = str;
char tempRead[30];
if (fgets(tempRead, sizeof(tempRead), stdin) != 0)
{
char *src = tempRead;
char c;
while ((c = *src++) != '\0')
{
if (c != ' ')
*dst++ = c;
}
}
*dst = '\0';
}
这会将非空格复制tempRead
到中str
,包括换行符;如果您愿意,可以使用isspace()
or isblank()
from #include <ctype.h>
。我不相信 30 对于本地字符串来说是一个很好的长度,但这就是您在问题中所遇到的。可以说,您应该指定接口中提供的字符串大小:void *read_RemoveSpace(char *buffer, size_t buflen)
. 您还可以让函数返回指向字符串末尾的 null 的指针(从而间接给出字符串的长度减去空格)。
void read_RemoveSpace(char *buffer, size_t buflen)
{
char *dst = buffer;
char tempRead[buflen];
if (fgets(tempRead, sizeof(tempRead), stdin) != 0)
{
char *src = tempRead;
char c;
while ((c = *src++) != '\0')
{
if (!isspace((unsigned char)c))
*dst++ = c;
}
}
*dst = '\0';
return dst;
}
没有太大的不同,但更安全。它使用本地 VLA(可变长度数组),它是 C99 的一部分。可以放弃 VLA 并直接复制到目标缓冲区:
void read_RemoveSpace(char *buffer, size_t buflen)
{
char *dst = buffer;
if (fgets(buffer, buflen, stdin) != 0)
{
char *src = buffer;
char c;
while ((c = *src++) != '\0')
{
if (!isspace((unsigned char)c))
*dst++ = c;
}
}
*dst = '\0';
return dst;
}
直到第一个空格,这个复制都是无操作的;此后,它将字符复制到它们的最终位置。