Concatenando um terminador nulo faz com que uma falha de segmentação

StackOverflow https://stackoverflow.com/questions/1669589

  •  13-09-2019
  •  | 
  •  

Pergunta

Eu sou novo para C e, recentemente, eu tenho um problema com uma função strcat. Eu tenho uma matriz de argumentos definida como:

#define MAXARGS 10;

char *argvalues[MAXARGS];

Tudo que eu quero é concatenar o último elemento não nulo da matriz com um terminador nulo. Aqui é a parte do meu código para isso:

while (argvalues[i] != NULL) {
  if (argvalues[i] == NULL){
    strcat(argvalues[i-1], '/0');
    printf("i is: %d\n", i);
    break;
  }
  i++;
}

Você tem alguma idéia de por falha de segmentação acontece e é realmente a maneira certa de usar strcat?

Foi útil?

Solução

concatena strcat dois ponteiros de char gosto assim.

char *p1[12];
char *p2 = "world";
strcpy(p1,"hello ");
strcat(p1,p2);

pi passou a deter - Olá mundo Você tem que ter certeza de que o destino tem espaço suficiente para o resultado concatenado.

Outras dicas

O seu ciclo está vagando passado o fim de sua matriz. Isso é o que está causando o segfault. Em C não há nenhuma garantia de que uma variável não inicializada será nulo, ou qualquer outra coisa para essa matéria. Portanto, o seu ciclo mantém looping até que ele tenta acessar argvalues ??[11], o que não existe. Daí falha de segmentação.

while (argvalues[i] != NULL) {
  if (argvalues[i] == NULL){

Estes dois contradizem uns aos outros. Isso nunca vai chegar até a instrução if porque o while vai sair pela primeira vez quando ele descobre que argvalues ??[i] == NULL. E se todos os 10 de seus argumentos são definidas em seguida, você tentará argvalues ??de acesso [11], que vai Segfault como mencionado anteriormente.

Para usar corretamente strcat você tem que ter um buffer de string que é grande o suficiente para aceitar a cadeia que está concatenando para o final do mesmo. Por exemplo, se você deseja adicionar "mundo" para um buffer já contendo "Olá" buffer Olá deve ser declarado para ser pelo menos tão longo como "Olá" + "mundo" plus mais 1 personagem (o '\ 0' no final).

// Here's an example.
char buffer[12];
strcpy(buffer, "hello");
strcat(buffer, " world");

Se você tentar fazer isso, ele irá falhar:

// Buffer isn't big enough to copy into.
char buffer[] = "hello";
strcat(buffer, " world");

Para descobrir exatamente o que você está fazendo que vamos precisar de um pouco mais descrição e código. O melhor lugar para adicionar o terminador nulo aos seus argumentos seria quando os argumentos são primeiro set. Dependendo de como você está definindo seus argumentos ele já pode estar acontecendo para você.

Como Alcon apontou, você nunca vai alcançar o strcat () com este código. Você precisa mudar o seu loop para algo como isto:

while (i < MAXARGS) {
   ...
}

Além disso, passar um ponteiro nulo para strcat (). É preciso uma string, não um personagem. '\ 0' é um caractere nulo, o que vai ser "promovido" a um ponteiro nulo. "" Ou "\ 0" seria uma cadeia vazia, mas isso não acrescentaria um nulo qualquer um. strcat (0) não é a coisa certa para usar aqui, porque ele procura o terminador nulo antes de concatenação. Portanto, você não pode usá-lo para adicionar um terminador nulo!

Se você ainda não tem um terminador nulo em cada corda na matriz, ou se não sabe a sua extensão, não vejo como você pode encontrar o fim de adicionar um terminador nulo. Parece uma espécie de "call me e eu vou dizer-lhe o meu número de telefone" situação.

Esta não é a boa maneira de fazer isso!

Se você tem certeza que seu char * não tem "\ 0" você poderia fazer suas coisas como esta:

char* oldargvalues = argvalues;
while(*argvalues++);
argvalues = 0;

(oldargvalues ??é manter uma faixa do início do char *). Mas mesmo assim, é estranho já que o ciclo vai terminar, se você tem já uma "\ 0" char.

Eu não entendo o loop que você tem. Parece que ele nunca vai fazer nada. No loop while você verificar se argvalues ??[i]! = NULL. No próximo declaração, verificar se ele é NULL. Uma delas é sempre vai ser falsa (não pode ser tanto NULL e não-NULL), de modo que este laço nunca vai fazer nada. Eu acho que você quer algo como o seguinte:

#define MAXARGS 10;
char *argvalues[MAXARGS];
int i = 1;
while (i < MAXARGS) 
{
   if (argvalues[i] == NULL)
   {
      //Notice here:  as mentioned by other posters, you need to pass 
      //a string to strcat, not a char
      strcat(argvalues[i-1], "");
      printf("i is: %d\n", i);
      break;
    }

    i++;
}

O que Alcon e Fred disse são verdadeiras, mais parece que o seu argvalues já está terminada em nulo, por isso não está claro o que você está realmente tentando fazer. Você não deve usar strcat a menos que a primeira cadeia de argumento está em um buffer que você já alocados para que você sabe que é grande o suficiente. Como se você tiver void main(char* argv[], int argc) você nunca diria strcat(argv[i], ...), embora strcat(..., "") é um-op não.

Casal de problemas:

A sua gama argvalues ??não é automaticamente inicializado para ser tudo NULL, você vai ter que fazer isso manualmente, então direita da bat, você pode não detectar o NULL em seu loop while () como outros já indicado.

Como é argvalues ??sendo set?

Obrigado a todos pelas respostas !!!!!

Eu acho que resolveu o problema, principalmente o que eu tenho feito é criar uma nova variável char [size], em seguida, copiar o último argumento na verdade, colocar o terminador nulo nessa variável e copie de volta para o último argumento. funciona ok, mas o código é confuso. isso pode fazer smth com ele mais tarde. strcat é para cordas apenas, não para chars, Obrigado por apontar toda a falta em meu código!

Obrigado a todos !!!! muito apreciada!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top