我从这段代码中遇到了细分错误,有人可以告诉我这是什么问题吗?我遇到了分段错误,所以我假设我在某些时候弄乱了指针。它应该返回并在字符串中输出最大的数字。
它应该返回数字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("%d\n",*p);
}
int* greatest(char* string)
{
int i = 0;
int *poi = 0;
while (*(string + i) != '\0')
{
if(*(string + i) >= '0' && *(string + i) <= '9')
{
if(*((string + i)-48) > *poi)
{
*poi = *((string + i)-48);
}
}
i++;
}
return poi;
}
这是执行代码后得到的:
“分段错误(核心已转储)”
答案 0 :(得分:1)
主要问题是您设置了int *poi = 0;
,然后尝试将值放入该位置。你不能那样做。指针必须指向存储位置,然后才能在其中存储值。 0
或NULL
是无效的地址,用于将指针标记为未初始化。 (指针指向无处。)
要使其成为有效的指针,使其指向某物:
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 ('\0')
{
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: %s\n", string);
}
else {
printf("%c\n", *p);
}
}
答案 1 :(得分:0)
#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("%d\n",p);
}
int greatest(char* string)
{
int i = 0;
int poi = 0 ;
while (string[i] != '\0')
{
if((string[i]) >= '0' && *(string + i) <= '9')
{
if(((string[i])-'0') > poi)
{
poi = ((string [i])-'0');
}
}
i++;
}
return poi;
}
我想我必须这样做。我想返回一个指针,但是如果我找不到答案,那会很好,我会继续尝试。也感谢您的帮助,拥有令人赞叹的人的令人惊叹的网站