C 分段错误(堆芯转储)字符数组

C 分段错误(堆芯转储)字符数组,c,segmentation-fault,C,Segmentation Fault,我试图从用户那里读入一个句子,并将其放入一个数组中,每个字母都包含一个字符值。每次我运行程序时,我都能输入句子,但之后会出现“分段错误(核心转储)”。所有这些都发生在从main调用的函数中 int words(char sentence[]){ int i=0; printf("Please enter your favorite sentence(max 100 characters).\n"); scanf("%c", &sentence);

我试图从用户那里读入一个句子,并将其放入一个数组中,每个字母都包含一个字符值。每次我运行程序时,我都能输入句子,但之后会出现“分段错误(核心转储)”。所有这些都发生在从main调用的函数中

int words(char sentence[]){
int i=0;
    printf("Please enter your favorite sentence(max 100 characters).\n");
    scanf("%c", &sentence);
            while(sentence != "." && sentence != "!"){
            i++;
            scanf("%c", &sentence[i]);
            }
    printf("%d", i);
    return i;
}

使用
-Wall-Wextra
编译时,编译器会说什么。如果编译时没有警告,就无法正确编写C代码。每个人都说你会把C代码搞得一团糟,它可以让你做任何事情。这是真的,但是警告是用来帮助你的

我不知道为什么人们要你去
gdb
valgrind
。对我来说,这段代码永远不应该被执行,而且应该是正确的。我的编译器发出以下警告:

words.c: In function ‘words’:
words.c:6: warning: format ‘%c’ expects type ‘char *’, but argument 2 has type ‘char **’
words.c:7: warning: comparison with string literal results in unspecified behavior
words.c:7: warning: comparison with string literal results in unspecified behavior

修复这些警告,如果仍然存在问题,请返回。或者,如果您不理解这些警告的含义,请询问有关它的特定问题。

将代码更改为此,它将工作:

char sentence[30];
int i=0;
printf("Enter phrase: \n");
scanf("%c", sentence);
while(sentence[i]!='.' && sentence[i]!='!')
{
        i++;
        scanf("%c",&sentence[i]);
}
printf("%d\n", i);
return i;

您只需要从第四行的scanf中删除“&”,因为没有数组索引指示的句子本身就是内存地址。请注意,如果句子总是以“.”或“!”结尾,则此选项有效。尽管我相信有比一次读一个字符更好的方法。

你通过GDB运行过这个吗?另外-如果句子没有以句号或感叹号结尾怎么办?通过GDB之类的调试器运行它,或者使用valgrind之类的工具。这可以很快看出代码有什么问题。也许你希望你在
scanf
中的第一个作业是
&句子[0]
?除了@Evert的建议之外,你的while语句不应该是:while(句子[i]!=”&句子[i]!=“!”){?@bruceg不,不应该。在一般情况下,不要将整数与指针进行比较。每当我看到“segfault”时,我会立即将人发送到GDB.TBH,部分原因是我懒惰……我将开始默认“使用
-Wall-Wextra
编译,修复这些错误,然后运行GDB”。总的来说,这一点很好。@tonysdg:当然,您默认转到
gdb
,因为您的SEGFULT是由警告未捕获的内容引起的,因为您已经知道要使用它们进行编译!哈哈,这就是我的观点-我应该开始默认我的响应,因此:)(不,我忘了用这些标志编译,我不愿意承认)