我试图用C语言将一个字符串分成6个字块,而我的时间非常粗糙。如果您输入一个12个字符长的字符串,它只会打印两个不常见的字符。
CHARACTER SET utf8
我感谢任何帮助。
答案 0 :(得分:1)
你的问题在
int lastElement = strlen(chunk) - 1;
首先,strlen
计算直到NUL字符的字符数。您的阵列最初未初始化,因此可能会导致问题。
假设您的阵列充满了NUL,并且您已经开始使用2个字符,并且您希望放置第三个字符。请记住,您的2个字符分别位于0和1位置。因此,strlen
将返回2(您的字符串有2个字符),您减去一个,因此lastElement
变量现在的值为1。然后将第三个字符放在索引1处,从而覆盖您已经拥有的第二个字符。
此外,这是非常低效的,因为您每次都计算字符数。但是等等,你已经知道你有多少个角色(你在counter
计算它们,不是吗?)。那么为什么不使用counter
来计算应该放置新字符的索引呢? (注意不要做同样的错误并覆盖别的东西)。
答案 1 :(得分:0)
功能错误。
本声明
int lastElement = strlen(chunk) - 1;
会导致函数的未定义行为,因为首先数组chunk
最初未初始化
char chunk[7];
其次是在此声明之后
memset(chunk, '\0', sizeof chunk);
变量lastElement
的值将等于-1。
这个if语句
if (chunk != NULL)
{
printf(chunk);
}
没有意义,因为数组chunk
的第一个字符的地址始终不等于NULL
。
您的意思似乎如下。
#include <stdio.h>
#include <ctype.h>
void stringSplit( const char s[] )
{
const size_t N = 6;
char chunk[N + 1];
size_t i = 0;
for ( ; *s; ++s )
{
if ( !isspace( ( unsigned char )*s ) )
{
chunk[i++] = *s;
if ( i == N )
{
chunk[i] = '\0';
i = 0;
puts( chunk );
}
}
}
if ( i != 0 )
{
chunk[i] = '\0';
puts( chunk );
}
}
int main(void)
{
char s[] = " You and I are beginners in C ";
stringSplit( s );
}
程序输出
Youand
Iarebe
ginner
sinC
您可以修改函数,使块的长度指定为函数参数。
例如
#include <stdio.h>
#include <ctype.h>
void stringSplit( const char s[], size_t n )
{
if ( n )
{
char chunk[n + 1];
size_t i = 0;
for ( ; *s; ++s )
{
if ( !isspace( ( unsigned char )*s ) )
{
chunk[i++] = *s;
if ( i == n )
{
chunk[i] = '\0';
i = 0;
puts( chunk );
}
}
}
if ( i != 0 )
{
chunk[i] = '\0';
puts( chunk );
}
}
}
int main(void)
{
char s[] = " You and I are beginners in C ";
for ( size_t i = 3; i < 10; i++ )
{
stringSplit( s, i );
puts( "" );
}
}
程序输出
You
and
Iar
ebe
gin
ner
sin
C
Youa
ndIa
rebe
ginn
ersi
nC
Youan
dIare
begin
nersi
nC
Youand
Iarebe
ginner
sinC
YouandI
arebegi
nnersin
C
YouandIa
rebeginn
ersinC
YouandIar
ebeginner
sinC