2009-11-13 60 views
0

提供了一个指向字符串的指针数组作为输入。任务是反转存储在输入指针数组中的每个字符串。我做了一个名为reverseString()的函数,它反转了传递给它的字符串。据我所知,这个功能正常工作。存储在指向C中多个字符串的指针数组中的单个字符串存在问题

在输入指针数组中存储/引用的字符串被逐个发送到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 
+0

这功课吗? –

+0

我从参考书上学习C编程。这个问题是本书的练习之一。所以我想这不能归类为功课,可以吗? (我不是很清楚这个,因为我是一个新手在stackoverflow ...) – nhylated

+0

http://stackoverflow.com/questions/1614723/why-is-this-c-code-causing-a-segmentation-故障 即使功能名称也是一样的。 – AnT

回答

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字节长。

+0

澄清:在第一个示例(和问题中的代码)中,您有指向字符串文本(它是只读的)的指针。在第二个例子中,你有一个非只读数组,初始化_from_字符串文字。 –

+0

谢谢@Pavel。希望您不要介意我将您的评论复制到我的答案中。 – pmg

+0

感谢pmg&Pavel。我了解这个问题,我的代码现在可以工作了... – nhylated

2

字符串( “ABCDE” 等)可以被存储在只读存储器。因此,当您尝试修改这些字符串时,任何事情都是可能的。指向字符串的指针是可修改的;它只是它们本身不是的。

你应该包括<string.h>获得的strlen(3)的声明,另一头获取功能getch() - 它不是在<stdio.h>我的MacOS X系统上(所以我删除电话;它在任何<stdio.h><conio.h>可能宣布在Windows上)。

+0

'getch()'在'';这当然是非标准的(我认为,起源于Turbo C)。 –

+0

谢谢帕维尔;我会尽力记住这一点。 –

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++; 
    } 
} 
相关问题