处理存储在C中多个字符串的指针数组中的单个字符串的问题

时间:2009-11-13 00:19:29

标签: c arrays string pointers

提供指向字符串的指针数组作为输入。任务是反转存储在指针输入数组中的每个字符串。我创建了一个名为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 个答案:

答案 0 :(得分:6)

您正在尝试更改字符串文字。

字符串文字通常不可修改,实际上应该声明为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个字节。

答案 1 :(得分:2)

字符串(“abcde”等)可以存储在只读存储器中。因此,当您尝试修改这些字符串时,一切皆有可能。指向字符串的指针是可修改的;它只是字符串本身不是。

您应该包含<string.h>以获取strlen(3)的声明,并使用另一个标头来获取函数getch() - 它不在我的MacOS X系统上的<stdio.h>中(所以我删除了调用;它可能在Windows上的<stdio.h><conio.h>中声明。

答案 2 :(得分:0)

希望这对你有所帮助!我在这里做的是,我将转到字符串中最后一个字符的地址,然后通过将指针减少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++;
    }
}