c - 将字符数组解析为指针数组中的单词(C 编程)

标签 c arrays string parsing

我试图将字符数组中的每个单词分开,并将它们放入一个指针数组中,每个插槽一个单词。另外,我应该使用 isspace() 来检测空白。但如果有更好的方法,我会洗耳恭听。在代码的最后我想打印出参数数组的内容。

假设这行是:“这是一个句子”。发生的事情是它打印出“句子”(行中的最后一个单词,通常后面跟着一些随机字符)4 次(单词数)。然后我得到“段错误(核心已转储)”。

我哪里错了?

int split_line(char line[120])
{
    char *param[21]; // Here I want to put one word for each slot
    char buffer[120]; // Word buffer
    int i; // For characters in line
    int j = 0; // For param words   
    int k = 0; // For buffer chars

    for(i = 0; i < 120; i++)    
    {
        if(line[i] == '\0')
            break;
        else if(!isspace(line[i]))   
        {    
            buffer[k] = line[i];
            k++;    
        }    
        else if(isspace(line[i]))
        {
            buffer[k+1] = '\0';
            param[j] = buffer; // Puts word into pointer array   
            j++;    
            k = 0;    
        }   
        else if(j == 21)    
        {
            param[j] = NULL;    
            break;    
        }    
    }    

    i = 0;
    while(param[i] != NULL)    
    {    
        printf("%s\n", param[i]);    
        i++;    
    }    
    return 0;    
}

最佳答案

这段代码有很多小问题:

  • param[j] = 缓冲区; k = 0; :你在缓冲区的开头重写删除之前的单词
  • if(!isspace(line[i])) ... else if(isspace(line[i])) ... else ... : isspace(line[ i]) 为真或假,您始终使用 2 个第一个选项,从不使用第三个。
  • if (line[i] == '\0') :您忘记以 '\0' 结束当前单词
  • 如果有多个空格,您目前(尝试)在参数中添加空词

这是一个工作版本:

int split_line(char line[120])

{

    char *param[21]; // Here I want to put one word for each slot
    char buffer[120]; // Word buffer
    int i; // For characters in line
    int j = 0; // For param words
    int k = 0; // For buffer chars
    int inspace = 0;

    param[j] = buffer;

    for(i = 0; i < 120; i++) {
        if(line[i] == '\0') {
            param[j++][k] = '\0';
            param[j] = NULL;
            break;
        }
        else if(!isspace(line[i])) {
            inspace = 0;
            param[j][k++] = line[i];
        }
        else if (! inspace) {
            inspace = 1;
            param[j++][k] = '\0';
            param[j] = &(param[j-1][k+1]);
            k = 0;
            if(j == 21) {
                param[j] = NULL;
                break;
            }
        }
    }



    i = 0;

    while(param[i] != NULL)

    {

        printf("%s\n", param[i]);

        i++;

    }

    return 0;

}

我只修复了错误。我将以下改进留给您作为练习:

  • split_line 例程不应自行打印,而应返回一个单词数组 - 请注意,您不能返回一个自动数组,但这是另一个问题
  • 你的代码中不应该有魔法常量 (120),你至少应该有一个 #define 并使用符号常量,或者最好接受一行任何大小 - 这里又不简单,因为您必须在适当的地方进行 malloc 和 free,这又是一个不同的问题

无论如何,祝你学习好用的 C :-)

关于c - 将字符数组解析为指针数组中的单词(C 编程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26266052/

相关文章:

javascript - 单击按钮时从存储在变量中的数组更新图表数据

java - 如何使用指数表示法将 double 转换为 n 字符的字符串?

c - 在 C 中排列不需要的字符

将时间常数编译为 float

构造一个逻辑表达式,它将计算一个字节中的位

c - 根本没有使用Redis静态函数

android - 在 Kotlin 中解析二维数组

c - C编程中的strcpy错误

c - 结构的字符串元素不保留分配的值

c - 套接字编程-简单的客户端/服务器