我正在尝试读取缓冲区,复制所有非字母字符并将其转储到另一个缓冲区中。
我遇到的问题是,每当遇到非数字字符时,它都不会复制任何内容。
我试图尝试检测空格,使用辅助缓冲区......
int main(void)
{
char buffer[] = "103 PLUS 1";
char buffer2[] = "a";
int i, number;
memset(buffer2, 0, sizeof (buffer2));
size_t length = strlen(buffer);
fprintf(stdout,"Buffer initially: %s \n", buffer);
fprintf(stdout,"Buffer2 initially: %s \n", buffer2);
for(i=0; i<length; i++)
{
if (number = isalpha(buffer[i]) == 0)
{
strncpy(&buffer2[i], &buffer[i], 1);
}
}
fprintf(stdout, "Copied buffer is: %s \n", buffer2);
return 0;
}
提前致谢。
答案 0 :(得分:3)
buffer2
的第一个元素保留为0,表示C字符串的结尾。实际上,buffer
和buffer2
中相同字符的索引应该不同,因为字符在C字符串中必须一致,但不会复制某些字符。buffer
初始化"a"
。请改用{0}
。number
。精炼代码:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void)
{
char buffer[80] = "103 PLUS 1";
char buffer2[80] = {0};
int i, j = 0;
size_t length = strlen(buffer);
fprintf(stdout,"Buffer initially: %s \n", buffer);
fprintf(stdout,"Buffer2 initially: %s \n", buffer2);
for(i = 0; i < length; i++)
{
if (isalpha(buffer[i]))
{
strncpy(&buffer2[j++], &buffer[i], 1);
}
}
fprintf(stdout, "Copied buffer is: %s \n", buffer2);
return 0;
}
输出:
Buffer initially: 103 PLUS 1
Buffer2 initially:
Copied buffer is: PLUS
答案 1 :(得分:2)
当你跳过复制一个字符时,buffer2
会留下原来在那个位置的任何东西,它似乎是0(但可能并不总是如此),这就是为什么打印它看起来不像其他字符被复制了。实际上,它们是,但跳过的字符被解释为该字符串的空终止。
但更糟糕的是,你永远不会为buffer2
分配空间:你让编译器去做,这意味着你不能真正修改那个空间。与上面一样,你可能正在使用它,但它是未定义的行为,并且实际上可能会使你的程序崩溃。