[英]Warning: initialization makes pointer from integer without a cast(integer pointers)
[英]How pointers work in a function in C - Pointer to integer without a cast
我目前正在為即將到來的考試使用指針,並且正在練習一些練習題來復習它們。 我想使用給定的函數簽名制作自己的strrchr函數版本:
char* mystrrchr(char*s, int c) {
而主要領域:
int main(void) {
char* s = "ENCE260";
char* foundAt = mystrrchr(s, 'E');
if (foundAt == NULL) {
puts("Not found");
}
else {
printf("%zd\n", foundAt - s);
}
}
我希望代碼能夠在不對main和function簽名進行任何更改的情況下工作。
我想返回字符c上次以整數形式出現在字符串s中的索引。 代碼的技巧很好,我只是不確定在這種情況下如何正確使用指針以返回所需的輸出。 作為參考,我收到的錯誤是我從整數進行指針轉換而沒有強制轉換。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <stdbool.h>
#include <assert.h>
char* mystrrchr(char*s, int c) {
int position;
int len = strlen(s);
int i = 0;
while (i < len) {
if (c == s[i]) {
position = i;
i++;
}
else {
i++;
}
}
return position;
}
int main(void) {
char* s = "ENCE260";
char* foundAt = mystrrchr(s, 'E');
if (foundAt == NULL) {
puts("Not found");
}
else {
printf("%zd\n", foundAt - s);
}
}
到目前為止,這就是我的代碼。
首先你可以改變
char*mystrrchr(char*s, int c) {
...
return position;
}
至
char*mystrrchr(char*s, int c) {
...
return s + position;
}
因為第一個版本返回相對位置。
然后,您還需要初始化position
:
char*mystrrchr(char*s, int c) {
int position = -1;
...
}
如果什么也沒找到,則返回NULL
:
char*mystrrchr(char*s, int c) {
int position = -1;
...
if(position == -1) return NULL;
else return s + position;
}
此時,該功能正常工作。
但是您可以通過使用來提高性能
while (s[i] != '\0')
而不是使用strlen
,如Jonathan Leffler在評論中指出的那樣。
將mystrrchr
定義為int mystrrchr
並調用int foundAt = mystrrchr(
。然后調用printf("%d\\n", foundAt)
。
char* mystrrchr(char*s, int c) {
if ( s == NULL ) return NULL;
char *position = NULL;
int i = 0;
while (s[i] != '\0' ) {
if (c == s[i]) {
position = &s[i];
}
i++;
}
return position;
}
您也可以倒退:
char* mystrrchr2(char*s, int c) {
if ( s == NULL ) return NULL;
char *position = NULL;
int i = strlen(s) - 1;
while (i > -1) {
if (c == s[i]) {
position = &s[i];
break;
}
i--;
}
return position;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.