c - 如何标记字符串[数组]?

标签 c arrays string parsing nested-loops

我需要从数组中标记一个字符串,我只需要三个单词并忽略所有制表符 '\t' 和空格 ' '

数组 line[] 只是一个测试用例。

我调试了我的,第一个数组(应该只包含第一个单词)被空格和来自 3 个单词的字母填充,当遇到制表符或空格时不会在第一个单词后停止。顺便说一句,我的程序崩溃了。我怀疑可能会超出数组边界。

我做错了什么?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char line[] = "         CLOOP       LDA             buffer,x";

    char array1[20] ="";
    char array2[20] ="";
    char array3[20] ="";

    int i = 0;
    for( i ; i<strlen(line) ; i++)
    {
        while ( (line[i] != ' ') && (line[i] != '\t'))
        {

            if(array1[0] == '\0')
            {
                int j = 0;

                while(line[i] != ' ' && line[i] != '\t')
                {
                    array1[j] = line[i];
                    i++;
                    j++;
                }
            }

            if(array2[0] =='\0');
            {
                int k = 0;

                while(line[i] != ' ' && line[i] != '\t')
                {
                    array2[k] = line[i];
                    i++;
                    k++;  
                }   
            }

            if(array3[0] == '\0')
            {
                int g = 0;

                while(line[i] != ' ' && line[i] != '\t')
                {
                    array3[g] = line[i];
                    i++;
                    g++;
                }

            }

        }
    }

    printf("array 1: %s\n array2: %s\n array3: %s\n", array1, array2, array3);

    return(0);
}

最佳答案

你把事情搞得太复杂了。首先,很难同时提供所有 3 数组。一个 token 的处理应该在移动到另一个 token 之前完全完成。

我建议在开始处理 token 之前“吃掉”所有空白。 这是通过以下方式完成的:

// skip leading delimiters
if( skip_leading_delimiters )
{
     if( is_delimiter( delimiters, line[i]) ) continue;
     skip_leading_delimiters = 0;
}

token 处理后,您可以移至下一个 token 并处理它。我尽量保留你的概念和方法。 while 循环的数量已减少到 0,因为 //skip leading delimiters 部分会处理它。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int is_delimiter(const char * delimiters, char c) // check for a delimiter
{
    char *p = strchr (delimiters, c);    // if not NULL c is separator

    if (p) return 1;                     // delimeter
    else return 0;                       // not a delimeter
}

int main()
{
    char line[] = "         CLOOP       LDA             buffer,x";

    char array1[20];
    char array2[20];
    char array3[20];

    int con1 = 1;
    int con2 = 0;
    int con3 = 0;

    int con1s = 0;
    int con2s = 0;
    int con3s = 0;

    int i = 0;
    int j = 0;

    int skip_leading_delimiters = 1;
    char * delimiters = " \b";

    for(i = 0; i < strlen(line); i++)
    {   
        // skip leading delimiters
        if( skip_leading_delimiters )
        {
            if( is_delimiter( delimiters, line[i]) ) continue;
            skip_leading_delimiters = 0;
        }

        if(con1)
        {
            if(line[i] != ' ' && line[i] != '\t')
            {
                array1[j] = line[i];
                j++;
                array1[j] = 0;
                con1s = 1;
            }
            else
            {
                if(con1s)
                {
                    con1 = 0;
                    con2 = 1;
                    skip_leading_delimiters = 1;
                    j = 0;
                }
                continue;
            }
        }

        if(con2)
        {
            if(line[i] != ' ' && line[i] != '\t')
            {
                array2[j] = line[i];
                j++;
                array2[j] = 0;
                con2s = 1;
            }
            else
            {
                con2 = 0;
                con3 = 1;
                skip_leading_delimiters = 1;
                j = 0;
                continue;
            }
        }

        if(con3)
        {
            if(line[i] != ' ' && line[i] != '\t')
            {
                array3[j] = line[i];
                j++;
                array3[j] = 0;
                con3s = 1;
            }
            else
            {
                con3 = 0;
                j = 0;
                continue;
            }
        }
    }

    printf(" array1: %s\n array2: %s\n array3: %s\n", array1, array2, array3);

    return(0);
}

输出:

 array1: CLOOP                                                                                                                               
 array2: LDA                                                                                                                                 
 array3: buffer,x  

关于c - 如何标记字符串[数组]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49470772/

相关文章:

c - 指向函数代码结尾的指针

c - 使用 setlocale() 和 gettext() 在 Ubuntu 上测试语言环境

c# - 如何知道一个字符串只包含特定的单词

string - 即使字符串只使用过一次,我是否应该使用常量而不是字符串?

c++ - 我该如何解决? (99瓶啤酒)

arrays - Groovy:如何检查字符串是否包含数组的任何元素?

C - 比较结构体和字符串变量时出错

c - dll中访问数组的效率

java - Java 中的高性能原始数组生成器

objective-c - 在 C 中访问 Apple Earbud Clicker 控件