Función de caracteres "contiene" -- ampo con strings camp codereview Relacionados El problema

String “Contains” char function


2
vote

problema

Español

Escribí esta función que hace lo siguiente desde cero sin buscar formas de que se realice normalmente:

  1. acepta un char c para buscar.
  2. acepta un char* str para buscar dentro.
  3. acepta un puntero de búfer y almacena todos los índices de c que se encuentran en str dentro del búfer proporcionado.
  4. devuelve el número de veces que se encontró c en str .

Por favor, critique y también, ¿hay mejores alternativas para exportar los índices que no sean el uso de un buffer PTR?

  #include <stdlib.h> #include <string.h> #include <stdio.h> int str_contains(const char c, const char* str, int* output_buffer){     int i, str_len;     str_len = strlen(str);     int *holder = malloc(str_len*sizeof(int));     int holder_iteration = 0;     for(i = 0; i < str_len; i++){         if(str[i] == c){             holder[holder_iteration++] = i;         }     }     memcpy(output_buffer,holder,holder_iteration*sizeof(int));     free(holder);      return holder_iteration; }  int main(){     char* myString = "Welcome to the jungle, baby. Do you like to juggle or jump around?";     int* output = malloc(500*sizeof(int));     int number = str_contains('a',myString,output);      printf("# of times: %d Indices:  ",number);     int i;     for(i = 0; i < number; i++){         printf("%d ",output[i]); }  free(output);     return(EXIT_SUCCESS); }   
Original en ingles

I wrote this function which does the following from scratch w/o looking for ways that it is typically done:

  1. Accepts a char c to search for.
  2. Accepts a char* str to search within.
  3. Accepts a buffer pointer, and stores all indices of c that are in str inside the provided buffer.
  4. Returns the # of times that c was found in str.

Please critique and also - Are there better alternatives to export the indices other than using a buffer ptr?

#include <stdlib.h> #include <string.h> #include <stdio.h> int str_contains(const char c, const char* str, int* output_buffer){     int i, str_len;     str_len = strlen(str);     int *holder = malloc(str_len*sizeof(int));     int holder_iteration = 0;     for(i = 0; i < str_len; i++){         if(str[i] == c){             holder[holder_iteration++] = i;         }     }     memcpy(output_buffer,holder,holder_iteration*sizeof(int));     free(holder);      return holder_iteration; }  int main(){     char* myString = "Welcome to the jungle, baby. Do you like to juggle or jump around?";     int* output = malloc(500*sizeof(int));     int number = str_contains('a',myString,output);      printf("# of times: %d\nIndices: \n",number);     int i;     for(i = 0; i < number; i++){         printf("%d\n",output[i]); }  free(output);     return(EXIT_SUCCESS); } 
     

Lista de respuestas

3
 
vote
  • El ((char*) p) + sizeof(struct memoryBlock);14 puede desbordarse ((char*) p) + sizeof(struct memoryBlock);15 . Recomiendo cambiar la firma a

      ((char*) p) + sizeof(struct memoryBlock);16  

    La persona que llama comparará el valor de retorno con el tamaño del tampón que pasó y actúe en consecuencia.

  • La memoria dinámica no se encuentra para. Puede recolectar a los índices con seguridad directamente en el búfer aprobado.

  • No hay necesidad de ((char*) p) + sizeof(struct memoryBlock);17 .

  • cuando sea apropiado, use los punteros.

todo lo que decía,

  ((char*) p) + sizeof(struct memoryBlock);18  
 
  • The final memcpy may overflow output_buffer. I recommend to change the signature to

    int str_contains(const char * str, char c, int *indices, size_t indices_size); 

    The caller shall compare the return value with the size of buffer it passed and act accordingly.

  • Dynamic memory is uncalled for. You may safely collect indices directly into the passed buffer.

  • There is no need for strlen.

  • When appropriate, use pointers.

All that said,

int str_contains(const char * str, char c, size_t * indices, size_t indices_size) {     size_t occurrences = 0;     for (char * cursor = str; *cursor; cursor++) {         if (*cursor == c) {             if (occurrences < indices_size) {                 indices[occurrences] = cursor - str;             }             occurrences++;         }     }     return occurrences; } 
 
 
   
   

Relacionados problema

18  Invirtiendo una cadena  ( Reversing a string ) 
Tuve esto como una pregunta de entrevista, y el entrevistador señaló esto. Esto es lo que escribí: //C# Syntax here public string Reverse(string s) { c...

3  Implementación más portátil de Tolower ()  ( More portable tolower implementation ) 
Me estoy desafiando a intentar intentar escribir una función que sea tan eficiente, portátil y a prueba de fallas posible. La función es muy simple y solo con...

1  Compruebe si dos cadenas son permutación entre sí  ( Check if two strings are permutation of each other ) 
private String sort(String word) { char[] content = word.toCharArray(); Arrays.sort(content); return new String(content); } private boolea...

9  Convierta una contraseña a una cadena fonética para usuarios finales  ( Convert a password to a phonetic string for end users ) 
Tanto como lo odio, a veces proporcionar contraseñas a las personas debe hacerse electrónicamente. Cuando hago eso, trato de eliminar cualquier ambigüedad que...

11  Optimizando el corrector de anagramas Java (comparar 2 cadenas)  ( Optimizing java anagram checker compare 2 strings ) 
Un anagrama es como una mezcla de las letras en una cadena: pots es un anagrama de detener wilma es un anagrama de ilwma Estoy pasando por el ...

10  Función recursiva que genera las permutaciones de una cadena  ( Recursive function that generates the permutations of a string ) 
Estoy buscando una revisión de mi función recursiva que genere las permutaciones de una cadena. ¿Hay mejores formas de hacer esto? var permutations = []; ...

8  Conversión de STD :: Chrono :: Time_Point to / from std :: string  ( Converting stdchronotime point to from stdstring ) 
Considere estas funciones que permitan convertir checkOnline.sh4 a / FROM checkOnline.sh5 Con un formato Fecha de fecha ". checkOnline.sh6 con uso:...

6  Las vocales en una cadena están en orden alfabético  ( Vowels in a string are in alphabetical order ) 
Tarea Escriba una implementación que devuelva si un 99887776655544330 tiene vocales (idioma inglés) en orden alfabético (A-Z) o no. Feedback es mi v...

2  Función para borrar un carácter en una cadena  ( Function to erase a character in a string ) 
void chrrem (char arr[], size_t len, size_t pos) { memmove(arr + pos, arr + (pos + 1), (len - pos) + 1); } Se supone que es simplemente rápido. Borra...

1  Imprima todos los tamaños posibles de subsecuencias de cadena en C  ( Print out all possible sizes of subsequences of string in c ) 
Por ejemplo, dada una cadena "abcdefghijk", quiero que mi función se imprima: a, b, c, d, e, f, g, h, i, j, k. ab, bc, cd, de, ef, fg, gh, hi, ij, jk ab...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos