我从这段代码中得到了分段错误,谁能告诉我出了什么问题? 我遇到了分段错误,所以我假设我在某个时候搞砸了指针。它应该返回并打印字符串中的最大数字。
它应该返回数字 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;
,然后尝试在该位置放置一个值。你不能这么做。指针必须指向内存位置,然后才能在其中存储值。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 (' ')
{
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;
}
我想我必须这样做。 我想返回一个指针,但如果我找不到答案也没关系,我会继续努力。也感谢您的帮助,令人惊叹的网站与令人惊叹的人