Проблема с обработкой отдельных строк, хранящихся в массиве указателей на несколько строк в C - PullRequest
0 голосов
/ 13 ноября 2009

Массив указателей на строки предоставляется в качестве входных данных. Задача состоит в обращении каждой строки, хранящейся во входном массиве указателей. Я создал функцию reverseString (), которая переворачивает переданную ей строку. Эта функция работает правильно, насколько я знаю.

Строки, сохраненные / на которые имеются ссылки во входном массиве указателей, отправляются одна за другой в функцию reverseString (). Но код зависает в какой-то момент в функции reverseString (), когда значения переданной строки меняются местами с помощью временной переменной. Я не могу понять, почему код зависает при обмене значениями. Пожалуйста, помогите мне с этим.

Код выглядит следующим образом:

#include <stdio.h>
void reverseString(char*);

int main()
{   char *s[] = {"abcde", "12345", "65gb"};
    int i=0;
    for(i=0; i< (sizeof(s)/sizeof(s[0]) ); i++ )
    {   reverseString(s[i]);
        printf("\n%s\n", s[i]);
    }

    getch();
    return 0;
}//end main

void reverseString(char *x)
{   int len = strlen(x)-1;
    int i=0; 
    char temp;
    while(i <= len-i)
    {   temp = x[i];
        x[i] = x[len-i];
        x[len-i] = temp;
            i++;
    }
}//end reverseString

Ответы [ 3 ]

6 голосов
/ 13 ноября 2009

Вы пытаетесь изменить строковые литералы.

Строковые литералы обычно не модифицируются, и действительно должны быть объявлены как const.

const char *s[] = {"abcde", "12345", "65gb"};
/* pointers to string literals */

Если вы хотите создать массив модифицируемых строк, попробуйте это:

char s[][24] = {"abcde", "12345", "65gb"};
/* non-readonly array initialized from string literals */

Компилятор автоматически определит, что вам нужно 3 строки, но он не может определить, какой длины должна быть каждая из них. Я сделал их длиной 24 байта.

2 голосов
/ 13 ноября 2009

Строки ("abcde" и т. Д.) Могут храниться в постоянной памяти. Поэтому, когда вы пытаетесь изменить эти строки, все возможно. Указатели на строки могут быть изменены; это просто сами строки, которых нет.

Вы должны включить <string.h>, чтобы получить объявление strlen(3), и другой заголовок, чтобы получить функцию getch() - ее нет в <stdio.h> в моей системе MacOS X (поэтому я удалил вызов; вероятно, объявлено в <stdio.h> или <conio.h> в Windows).

0 голосов
/ 30 августа 2014

Надеюсь, это поможет вам! то, что я делаю здесь, это то, что я иду к адресу последнего символа в строке, затем печатаю их все, уменьшая указатель на 1 единицу (для символа его 2 байта (пожалуйста, проверьте)).

//program to reverse the strings in an array of pointers
#include<stdio.h>
#include<string.h>
int main()
{
    char *str[] = {
        "to err is human....",
        "But to really mess things up...",
        "One needs to know C!!"
    };
    int i=0;    //for different strings
    char *p;    //declaring a pointer whose value i will be setting to the last character in 
                //the respective string
    while(i<3)  
    {
        p=str[i]+strlen(str[i])-1;
        while(*p!='\0')
        {
            printf("%c",*p);
            p--;
        }
        printf("\n");       
        i++;
    }
}
...