C语言 我的代码中的分段错误,为什么以及如何修复它?



我从这段代码中得到了分段错误,谁能告诉我出了什么问题? 我遇到了分段错误,所以我假设我在某个时候搞砸了指针。它应该返回并打印字符串中的最大数字。

它应该返回数字 5。

#include <stdio.h> 
#include <string.h>    
int* greatest(char* string); 
int main() 
{   
char *string = "This4 is5a 3wonderful2 day";
int *p = 0;   
p = greatest(string);
printf("%dn",*p);
}
int* greatest(char* string)
{
int i = 0;
int *poi = 0;
while (*(string + i) != '')  
{
if(*(string + i) >= '0' && *(string + i) <= '9')
{
if(*((string + i)-48) > *poi)
{
*poi = *((string + i)-48);
}
}
i++;
}
return poi;
} 

这是我在执行代码后得到的:

" 分段错误(核心转储(">

主要问题是您设置了int *poi = 0;,然后尝试在该位置放置一个值。你不能这么做。指针必须指向内存位置,然后才能在其中存储值。0NULL是用于将指针标记为未初始化的无效地址。(指针指向无处。

要使其成为有效的指针,请使其指向某些内容:

int *poi;
int p;
poi = &p;
*poi = 123;

(还可以使用malloc为指针动态分配内存(。

我猜你应该返回一个char *,它应该指向字符串中其中一个字符的地址:

char* greatest(const char* string)
{
// Safety check
if (NULL == string) return NULL;
char *poi = NULL;
while (*string)  // Loop until string points to end-of-string ('')
{
if (*string >= '0' && *string <= '9') { // see also: isdigit
if (NULL == poi)  { // poi hasn't been assigned yet
poi = string;
}
// No need to convert to int. Can just compare char codes
else if (*string > *poi) {
poi = string;
}
}
string++;
}
// At this point, poi either points to a char in string,
// or NULL (if no digits in string)
return poi;
}

然后将main更改为:

int main() 
{   
const char *string = "This4 is5a 3wonderful2 day";
char *p = greatest(string);
// Check p before printing it
if (NULL == p) {
printf("No digits in: %sn", string);
}
else {
printf("%cn", *p);
}
}
#include <stdio.h>
#include <string.h>

int greatest(char* string);
int main()
{
char *string = "This4 is5a 3wonderful2 day";
int p = 0 ;
p = greatest(string);
printf("%dn",p);
}
int greatest(char* string)
{
int i = 0;
int poi = 0 ;
while (string[i] != '')
{  
if((string[i]) >= '0' && *(string + i) <= '9')
{
if(((string[i])-'0') > poi)
{
poi = ((string [i])-'0');
}  
}
i++;
}
return poi;
}

我想我必须这样做。 我想返回一个指针,但如果我找不到答案也没关系,我会继续努力。也感谢您的帮助,令人惊叹的网站与令人惊叹的人

相关内容

  • 没有找到相关文章

最新更新