簡體   English   中英

指針如何在C中的函數中工作-指向不帶強制轉換的整數的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM