Two strings starting from one in C

0

Hello, I need software that reads a full name, consisting of a simple name and a last name, separated by "_" and printed separately.

The code should use the following main function:

#include <stdio.h>

int main(){
    char nome[30];
    char * sobrenome;
    scanf("%s", nome);
    sobrenome = extraiSobrenome(nome);
    printf("Nome\n%s\nSobrenome\n%s\n",nome, sobrenome );
    return 0;
}

I tried to write the extraiSobrenome(nome); function, but without success:

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

extraiSobrenome(nome){
    int i=0, j=0, aux;
    char nova[30], michael[30];
    char sobrenome[30];
    strcpy(nova, nome);
    for(i=0;i<(int)strlen(nova);i++){
        if(nova[i]==95){
            i++;
            break;
        }
    }
    aux=i;
    while(i<strlen(nova)){
        sobrenome[j]=nova[i];
        i++;
        j++;
    }
    sobrenome[strlen(nova)-aux] = '
#include <stdio.h>

int main(){
    char nome[30];
    char * sobrenome;
    scanf("%s", nome);
    sobrenome = extraiSobrenome(nome);
    printf("Nome\n%s\nSobrenome\n%s\n",nome, sobrenome );
    return 0;
}
'; return sobrenome; } int main(){ char nome[30]; char * sobrenome; scanf("%s", nome); sobrenome = extraiSobrenome(nome); printf("Nome\n%s\nSobrenome\n%s\n", nome, sobrenome ); return 0; }

The problem is not only to separate the surname, but to change the name too, can you help me?

    
asked by anonymous 29.11.2017 / 04:36

2 answers

2

Failed to declare the return of the extraiSobrenome function. Which in the case would be a character pointer, or char* .

Note that you need to change the variable nome original, otherwise you will not succeed when printing nome separately.

You could use the function of the standard library strtok to make this division every _ , but I believe that here the interest is not in using the standard library but in training writing algorithms in C. >

A suitable version of extraiSobrenome without using the default library:

char *extraiSobrenome(char *nome_com_sobrenome) {
  char *fim_nome = nome_com_sobrenome;
  while (*fim_nome != '_' && *fim_nome != '
char *extraiSobrenome(char *nome_com_sobrenome) {
  char *fim_nome = nome_com_sobrenome;
  while (*fim_nome != '_' && *fim_nome != '%pre%') {
    fim_nome++;
  }
  if (*fim_nome == '%pre%') {
    // oops, fim da palavra antes de achar o delimitador '_', devo retornar nulo ou um sobrenome vazio?
    return fim_nome; // estou retornando um sobrenome vazio para evitar falhas de segmentação
  }
  // se não caiu no 'if' anterior, então garanto que achou um '_'
  * fim_nome = '%pre%'; // estou marcando o fim do nome, substituindo o '_' pelo caracter nulo, portanto indicando que a string acabou
  return fim_nome +1; // usando aritmética de ponteiros para indicar que o sobrenome começa na próxima letra
}
') { fim_nome++; } if (*fim_nome == '%pre%') { // oops, fim da palavra antes de achar o delimitador '_', devo retornar nulo ou um sobrenome vazio? return fim_nome; // estou retornando um sobrenome vazio para evitar falhas de segmentação } // se não caiu no 'if' anterior, então garanto que achou um '_' * fim_nome = '%pre%'; // estou marcando o fim do nome, substituindo o '_' pelo caracter nulo, portanto indicando que a string acabou return fim_nome +1; // usando aritmética de ponteiros para indicar que o sobrenome começa na próxima letra }

Some other points I'd like to raise about your code:

  • You compared one character with 95; Okay, finally letters are numbers with zeros and ones, but what is 95? Why not compare directly with '_' ? Much more expressive this comparison and everyone who read your code and who does not know the decorated ASCII table will understand this version of the comparison
  • you returned an internally created vector in the function, and that's not cool ...
    These variables are stored in the stack, and they only make sense within the context of the execution of the function itself; when it returns, there is no longer any way to guarantee the meaning of the rest of the last call stack ... and this code is syntactically valid because internally C only works with the vector address, so you are returning an address of a value that is on the stack that can be overwritten at any time.

Read more about stack, heap , variable scope ... I will list some suggestions for readings:

About strtok :

29.11.2017 / 05:32
-2

What do you think of after recording the first name you add a space like this:

strcat(nome, " ");
    
29.11.2017 / 04:55