2016-08-03 2 views
-1
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char *s[]={"To err is human...","But to really mess things up...","One needs to know C!!"}; 
    int i,j,len,t; 
    for(i=0;i<=2;i++) 
    { 
     len=strlen(s[i]); 
     for(j=0;j<len/2;j++) 
     { 
      t=*(s[i]+len-1-j); 
      *(s[i]+len-1-j)=*(s[i]+j); 
      *(s[i]+j)=t; 
     } 
    } 
    for(i=0;i<=2;i++) 
     printf("%s\n",s[i]); 
    return 0; 
} 

Какая ошибка в вышеуказанной программе. Я просто обмениваю значения с обоих концов каждой строки.Обратные нити

+0

У вас возникли проблемы? – LordWilmore

+4

s - массив строк только для чтения. Попробуйте 'char s [] [100]' –

+1

'char * s [] = {(char []) {« Чтобы ошибаться человек ... »}, (char []) {« Но на самом деле все испортить. .. "}, (char []) {« Нужно знать C !! »}};' – BLUEPIXY

ответ

1

Ну, одна из ошибок заключается в том, что вы не включаете string.h, так что это не компиляция. Другой является то, что ваш массив char*-х, возможно, пойти только для чтения области памяти и изменения это вызовет странное поведение, так что лучше использовать:

char s[][255]={"To err is human...", 
     "But to really mess things up...","One needs to know C!!"}; 
2

Среди прочего,

char *s[]={"To err is human...","But to really mess things up...","One needs to know C!!"};

Здесь вы объявляете и инициализируете массив указателей на char. Таким образом, каждый указатель указывается на заданный строковый литерал. Итак, что бы вы ни делали внутри своего цикла for, чтобы изменить или изменить эти строки, это приведет к неопределенному поведению (в этом случае UB обычно является segfault/crash).

По крайней мере изменить это char s[][100] = {"To err is human...","But to really mess things up...","One needs to know C!!"};

+0

«Итак, что бы вы ни делали внутри цикла for, чтобы изменить или изменить эти строки» -> неопределенное поведение. Ошибка Seg - общая возможность, – chux

+0

@chux вы правы - изменены – artm

0

Как соответствующий C FAQ points out:

Q: В чем разница между этими инициализаций?

char a[] = "string literal"; 
char *p = "string literal"; 

Моя программа вылетает, если я пытаюсь присвоить новое значение p [i].

A: строка символов (формальный термин для двойных кавычек в источнике C) может быть использована в двух слегка различных способах:

  1. В качестве инициализатора для массива полукокса, как и в объявление char a[], оно определяет начальные значения символов в этом массиве (и, при необходимости, его размер).

  2. В любом другом месте он превращается в неназванный статический массив символов, и этот безымянный массив может храниться в постоянной памяти и поэтому не может быть изменен. В контексте выражения массив преобразуется сразу в указатель, как обычно (см. Раздел 6), поэтому второе объявление инициализирует p, чтобы указать на первый элемент неименованного массива.

Некоторые компиляторы имеют переключатель управления ли строковые литералы могут быть перезаписаны или нет (для компиляции старого кода), и некоторые из них могут иметь варианты вызывают строковые литералы, чтобы формально рассматриваться как массивы const char (для ловли лучше ошибок) ,

Существует много способов борьбы с этим. Одна из возможностей заключается в использовании strdup в вашей функции reverse_string и наоборот. Это требует, чтобы вызывающий абонент взял на себя ответственность за отмену строки free.

strdup не является отличной функцией, поскольку он должен найти длину строки, которая дублируется, что означает, что вы в конечном итоге обходите одно дополнительное время. Один из способов борьбы с этим - выделить память самостоятельно.

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

char * 
reverse_string(const char *s) { 
    char *cursor; 
    char *reversed; 
    size_t length; 

    if (!s) { 
     return NULL; 
    } 

    length = strlen(s); 

    reversed = malloc(length + 1); 

    if (!reversed) { 
     return NULL; 
    } 

    if (!length) { 
     *reversed = '\0'; 
     return reversed; 
    } 

    cursor = reversed; 

    while (length--) { 
     *(cursor++) = *(s + length); 
    } 

    *cursor = '\0'; 

    return reversed; 
} 


int main(void) 
{ 
    int i; 
    char *s[] = { 
     "To err is human...", 
     "But to really mess things up...", 
     "One needs to know C!!" 
    }; 

    for (i = 0; i < sizeof(s)/sizeof(s[0]); ++i) { 
     char *reversed = reverse_string(s[i]); 
     puts(reversed); 
     free(reversed); 
    } 

    return 0; 
} 
Смежные вопросы