gpt4 book ai didi

c - 分隔字符串的算法中的段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:20 24 4
gpt4 key购买 nike

我正在自学 C,并尝试使用我的知识(即不使用库)来创建一个执行以下操作的程序:

  • 将字符串拆分为单词(单词之间用空格分隔)
  • 将每个单词放在一个数组中

所以,最后,我必须有一个字符串数组(一个字符数组)。

这是我的代码:

#include <stdio.h>

int main () {
int i, conta, indice_completo=0, indice_nome=0, indice_caractere=0;
char nome [90], nomevetor [30] [90];


scanf ("%[^\n]s", nome);

while (nome[indice_completo] != '\0') {
while (nome[indice_completo] != ' ' && nome [indice_completo] != '\0') {
nomevetor [indice_nome] [indice_caractere] = nome [indice_completo];
indice_completo++;
indice_caractere++;
}
nomevetor [indice_nome] [indice_caractere] = '\0';
indice_caractere=0;
indice_nome++;
}
conta=indice_nome;

for (i=0 ; i<conta; i++) {
printf ("Nome %d: %s\n", i+1, nomevetor [i]);
}

return 0;
}

但是当我编译它时使用:

gcc -ansi -Wall -g programa.c -o programa

我遇到段错误。

  • 为什么会出现段错误?
  • 我的算法正确吗?
  • 有没有更好的方法来做我想做的事?

最佳答案

您的编码问题是,当您在输入中遇到空白时,您永远无法通过它。

添加一个循环:

while (nome[indice_completo] == ' ')
indice_completo++;

就在主循环结束之前。

固定代码:

#include <stdio.h>

int main(void)
{
int i, conta, indice_completo = 0, indice_nome = 0, indice_caractere = 0;
char nome[90], nomevetor[30][90];


scanf("%[^\n]s", nome);

while (nome[indice_completo] != '\0')
{
while (nome[indice_completo] != ' ' && nome[indice_completo] != '\0')
{
nomevetor[indice_nome][indice_caractere] = nome[indice_completo];
indice_completo++;
indice_caractere++;
}
nomevetor[indice_nome][indice_caractere] = '\0';
printf("Word: <<%s>>\n", nomevetor[indice_nome]);
indice_caractere = 0;
indice_nome++;
while (nome[indice_completo] == ' ')
indice_completo++;
}
conta = indice_nome;

for (i = 0; i < conta; i++)
{
printf("Nome %d: %s\n", i+1, nomevetor[i]);
}

return 0;
}

运行示例:

$ ./segfault
Arterial blockage I believe
Word: <<Arterial>>
Word: <<blockage>>
Word: <<I>>
Word: <<believe>>
Nome 1: Arterial
Nome 2: blockage
Nome 3: I
Nome 4: believe
$

(现在只有程序被错误命名了——它不再出现段错误了。)

您还需要确保没有任何东西超出限制。主要是,这将在格式字符串中使用 %89[^\n],因为在 90 个字符的缓冲区中不能有超过 45 个交替的非空白和空白。

如果输入以空格开头,则第一个“单词”将为空。您可以通过将“跳过”循环放在主循环的顶部来解决这个问题。

关于c - 分隔字符串的算法中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20035703/

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