我想做的是,从用户输入中获取消息并反转字符串。因此,我使用2个指针,一个指针指向消息数组的第一个元素,另一个指针指向最后一个元素。然后我进行交换,直到两个指针相遇。
#include <stdio.h>
#include <string.h>
void reverse(char* message);
int main()
{
char message[100];
printf("Enter a message: ");
scanf("%s",message);
printf("\nok");
reverse(message);
printf("ok \n");
printf("%s",message);
return 0;
}
void reverse(char* message){
char* p = message;
char* temp = message;
char* q = (message + (strlen(message)); // pointing to the last element before
// null character
printf("\ncoming");
while( p != q){
// why am I getting a segmentation fault? whats happening?
*p = *q;
*q = *temp;
p++;
q--;
temp = p;
}// while loop
}// reverse
答案 0 :(得分:1)
此行
char* q = (message + (strlen(message));
它是否指向最后一个字符。
考虑一个字符的消息-strlen(message)
将一个字符。但是第一个字符是char * q = message
因此该行应显示为
char* q = (message + strlen(message) - 1;
也可以交换
尝试
char temp;
然后代替
*p = *q;
*q = *temp;
p++;
q--;
temp = p;
使用
temp = *p; // We got the temp
*p = *q; // Old p is safe - it is now temp.
*q = temp;
p++;
q++;
使用此代码,不会反转空字符!因此,在正确的位置!
Finalluy,
while( p != q){
应该是
while( p < q){
答案 1 :(得分:0)
关于:
p++;
q--;
在上述语句之后,指针可以相互传递。然后循环一直运行到段为止。故障发生
答案 2 :(得分:0)
我修复了while循环条件。现在我给了while(p
两个指针p
和temp
都指向message
:
char* p = message;
char* temp = message;
在while循环中执行*p = *q;
时,由“ p” 指向的字符和由“ temp”指向的字符被更新为“ q”处的字符(因为以上声明)。
下一行*q = *temp;
实际上是将新更新的字符(“ * q”)复制回“ q”。
此外,如“ M Oehm”所指出的,
message + strlen(message)
指向NULL字符,而不是NULL之前的最后一个字符。
还请注意“ user3629249”发表的有关缺少括号的评论。
更正这些代码应该看起来像...
void reverse(char* message){
char* p = message;
char* temp = message;
char* q = (message + strlen(message)-1); // pointing to the last element
char c; //to store the value of "temp"
printf("\ncoming");
while( p < q){
c = *temp;
*p = *q;
*q = c;
p++;
q--;
temp = p;
}// while loop
}// reverse
话虽如此,由于“ C”按值传递参数,因此您可以实现相同的功能,如....
void reverse(char* message){
char* q = (message + strlen(message)-1);
char c;
while( message < q){
c = *message;
*message = *q;
*q = c;
message++;
q--;
}
}
答案 3 :(得分:-1)
segmentation fault是由试图读取或写入非法内存位置的程序引起的。对于p++
和q--
而言,while (p != q)
可以始终为真,例如,如果p
和q
指向两个连续的字符。检查此方法是否可以反转字符串:
#include <string.h>
void reverse(char *str)
{
//skip null string
if (str == 0)
{
return;
}
// skip empty string
if (*str == 0)
{
return;
}
// get range
char *start = str;
char *end = start + strlen(str) - 1; // -1 for the end \0
char temp;
// reverse
while (end > start)
{
// swap chars
temp = *start;
*start = *end;
*end = temp;
// move to next position
++start;
--end;
}
}
int main(void)
{
char s1[] = "Stack Overflow is GREAT!";
reverse(s1);
printf("%s\n", s1);
return 0;
}