0

在让用户输入他们的名字和姓氏后,我需要该程序执行多项工作,除了我需要编程以相反的顺序打印他们的名字(John Doe = Doe John)。由于我从你们那里得到了帮助,我认为我在它们中具有适当的功能,但是我仍然遇到分段错误。这里有什么问题。

这是程序中的最后一个函数

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

int main ()
{
    printf("Enter your first and last name\n");

    char name [25]={'\0'};
    char * space;

    fgets(name,sizeof(name),stdin);

    printf("You Entered: %s     \n", name);

    printf("There are %u characters in your name including the space. \n", strlen(name));

    char end;
    int i;
    end = strlen(name) -1;
    printf("Your name backwards is");
    for (i = end; i >= 0; --i)
    {
        printf("%c", name [i]);
    }

    printf("\nLooking for the space in your name \n", name);
    space=strchr(name, ' ');
    while (space!=NULL)
    {
        printf("The space was found at character %d\n", space-name+1);
        space=strchr(space+1, ' ');
    }
    //Why am I getting a segmentation fault (cord dumped) error here?
    *space = '\0';
    printf(" %s %s ", space+1, name);

}
4

2 回答 2

3

当 while 循环中断space为 NULL 时,您正在写入 NULL 地址。

while (space!=NULL) <-- "loop breaks when space is NULL"
{
    printf("The space was found at character %d\n", space-name+1);
    space=strchr(space+1, ' ');
}
//Why am I getting a segmentation fault (cord dumped) error here? 
*space = '\0';  <--- "space is NULL"

编辑:

要以相反的顺序打印输入的单词,请尝试以下代码(阅读注释以了解):

// suppose name is "Grijesh    Chauhan"
char *last = NULL, *firstspcae = NULL; 
firstspcae = space = strchr(name, ' ');
*firstspcae = '\0';  // At first space insert nul char '\0'
while (space != NULL)
{
    printf("The space was found at character %d\n", space-name+1);
    last = space + 1;  //next to space 
    space=strchr(space + 1, ' ');
}
printf("\n%s %s ", last, name);   // "Chauhan Grijesh"
*firstspcae = ' ';  // recover your original  string back 
printf("\n%s %s ", last, name);  // "Grijesh    Chauhan"
于 2013-09-27T15:55:16.033 回答
1

一种更通用的方法来找出你在哪一行得到你的 segfault ,gcc使用-g标志编译你的程序(例如gcc -g file.c)然后运行gdb'(例如gdb a.out)然后输入run然后where它应该给你 segfault 的行(或任何错误排序)及其背后的原因

于 2013-09-27T16:30:51.023 回答