将字符串拆分成块。

时间:2017-02-21 16:48:59

标签: c string chars

我试图用C语言将一个字符串分成6个字块,而我的时间非常粗糙。如果您输入一个12个字符长的字符串,它只会打印两个不常见的字符。

CHARACTER SET utf8

我感谢任何帮助。

2 个答案:

答案 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