2015-09-22 15 views
0

После проверки того, что strcat является местом возникновения ошибки, я затем проверяю предыдущий пример в моем назначении. В моих предыдущих примерах я использую strcat (фактически strncat) таким же образом, как и для моего следующего кода. Я не уверен.strcat дает мне ошибку ошибки сегментации

Цель моей программы - прокрутить «строку» и удалить любые встречные символы «c» из строки.

main.c:

char string[100]={0}, c[3]; 

printf("Enter a String: "); 
fgets(string, 100, stdin); 
if (string[98] == '\n' && string[99] == '\0') { while ((ch = fgetc(stdin)) != EOF && ch != '\n'); } 

printf("Enter a Char: "); 
fgets(c, 2, stdin); 
while ((ch = fgetc(stdin)) != EOF && ch != '\n'); 

rmchr(string, c[0]); 

Заголовок:

rmchr(char *string, char c) 
{ 
    int i=0; 
    char *word[100]; 

    int s = strlen(string); 

    for(i=0; i<=(s-2); i++) 
    { 
    if(string[i] != c) 
    { 
     strcat(word, string[i]); 
    } 
    } 
} 
+1

'strcat (слова, строки [я])' должны были не в состоянии компиляции. –

+0

GCC иногда объявляет строковые функции внутренними, даже когда программист забыл '#include '. – Davislor

+1

У вас есть функция rmchr в файле заголовка? Если это так, его следует перенести в файл C. – Jens

ответ

2
char *word[100]; 

Он будет держать строку в вашей программе, так что используйте:

char word[100]; 

, то есть массив от char вместо массива из char *.

Затем strcat соединяется с строкой, но word не инициализируется. Сделать это строка:

word[0] = '\0'; 

string[i] Тогда это персонаж, но strcat нужны указатели на аргументы символов: использовать использование указателя &string[i].

Наконец, проблема в вашей функции rmchr заключается в том, что она должна что-то возвращать либо через аргументы, либо с помощью оператора return, но это не так.

+0

@JohnKugelman в своей программе предназначен для хранения строки. – ouah

0

Есть более чем один пункт, чтобы упомянуть здесь, как

  1. rmchr() определение должно иметь тип возвращаемого значения, может быть void, если вы ничего не возвращает.

    [FWIW, в этом случае, я wounder, как вы будете использовать локальную переменную word]

  2. внутри rmchr(), word должен быть массивом char с, не char указатели. Вам необходимо изменить char * word[100] на char word[100].

  3. В strcat() оба аргумента должны быть указателем. В этом случае вам необходимо использовать &string[i].
+0

@ пользователь2864740 абсолютно, но это самое основное требование. Любой достойный компилятор бы закричал, иначе. :) –

0

Следующее, кажется, компилируется отлично, но ваш код не делает то, что вы сказали, «цель моей программы - прокрутить« строку »и удалить любые встреченные символы« c »из строки». , функция не удаляет символ или возвращает копию строки с исключенным символом. Я написал функцию, которая копирует строку после удаления символа и возвращает указатель на него.Ниже код немного изменен и под это моя функция

//Just a compilable version of your code, not sure if it does what u want 
#include <stdio.h> 
#include <string.h> 

void rmchr(char *string, char c) 
{ 
    int i=0; 
    char word[100]; 

    int s = (int)strlen(string); 

    for(i=0; i<=(s-2); i++) 
    { 
     if(string[i] != c) 
     { 
      strcat(word, (char *)(&string[i])); 
     } 
    } 
} 

int main(int argc, const char * argv[]) { 
    char string[100] = {0}, c[3]; 
    char ch; 

    printf("Enter a String: "); 
    fgets(string, 100, stdin); 
    if (string[98] == '\n' && string[99] == '\0') { 
     while ((ch = fgetc(stdin)) != EOF && ch != '\n'); 
    } 

    printf("Enter a Char: "); 
    fgets(c, 2, stdin); 
    while ((ch = fgetc(stdin)) != EOF && ch != '\n'); 

    rmchr(string, c[0]); 

    return 0; 
} 

Там вы идете с демо основной

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

char* rmchr(char *string, char ch) 
{ 
    int counter = 0; 
    int new_size = 0; 
    char corrected_string[100]; 

    while (string[counter] != '\n' && string[counter] != '\0' && string[counter] != EOF) { 
     if (string[counter] != ch) { 
      corrected_string[new_size] = string[counter]; 
      new_size++; 
     } 
     counter++; 
    } 
    char *new_string = (char *)malloc((new_size+1) * sizeof(char)); 

    for (int j = 0; j <= new_size; j++) { 
     new_string[j] = corrected_string[j]; 
    } 
    return new_string; 
} 

int main(int argc, const char * argv[]) { 

    char *s = "The char 'c' will be removed"; 
    char *new = rmchr(s, 'c'); 
    printf("%s", new); 
    return 0; 
} 
Смежные вопросы