gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:26:30 26 4
gpt4 key购买 nike

我试图将字符数组中的每个单词分开,并将它们放入一个指针数组中,每个插槽一个单词。另外,我应该使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com