簡體   English   中英

指針字符串未返回預期 output

[英]pointer string not returning expected output

 #include <stdio.h>
    
    void revstr(char str[])
    {
        char temp;
        int size = 0;
        while(*str != '\0'){
            size++;
            str++;
        }
        for (int i = 0; i < size/2; i++)        
        {
            temp = str[i];               
            str[i] = str[size-1-i];
            str[size-1-i] = temp;
        }
        for(int i = 0; i < size; i++)
        {
            printf("%c\n", *(str+i));
        }
    }
    int main()
    {
        char str[20];
        printf("enter a string: \n");
        scanf("%s", &str);
        revstr(str);
        return 0;
    }

為什么我的 rev 字符串不打印它正在打印出一些垃圾值的字符串的反轉。 你能指出為什么嗎?

在這個while循環之后

    while(*str != '\0'){
        size++;
        str++;
    }

指針 str 不指向字符串的開頭。

相反,你可以寫例如

    while( str[size] != '\0'){
        size++;
    }

盡管如此,這樣的 function 應該只做一件事:反轉字符串。 function 的調用者決定是否對 output 反轉字符串。

所以 function 看起來像

char * revstr( char s[] )
{
    size_t n = 0;

    while ( s[n] ) ++n;

    for ( size_t i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n - i - 1];
        s[n - i - 1] = c;
    }

    return s; 
}

主要是你可以寫

puts( revstr( str ) );

這是一個演示程序。

#include <stdio.h>

char * revstr( char s[] )
{
    size_t n = 0;

    while ( s[n] ) ++n;

    for ( size_t i = 0; i < n / 2; i++ )
    {
        char c = s[i];
        s[i] = s[n - i - 1];
        s[n - i - 1] = c;
    }

    return s; 
}

int main(void) 
{
    char s[] = "Hello";
    
    puts( s );
    puts( revstr( s ) );
    
    return 0;
}

程序 output 是

Hello
olleH

當然,您可以使用標准字符串 function strlen來代替 while 循環。

size_t n = strlen( s );

注意在scanf的調用中

scanf("%s", &str);

第二個參數應該是表達式str

scanf("%s", str);

我會以另一種方式實現它:

char *reverse(char *str)
{
    char *wrk = str, *end = str;

    if(str && *str)
    {
        while(*(end + 1)) end++;
        while(end > wrk)
        {
            char tmp = *end;
            *end-- = *wrk;
            *wrk++ = tmp;
        }   
    }
    return str;
}
  1. 最好檢查一下參數是否正確。
  2. 我會返回值。 它允許您在表達式中使用反轉字符串並作為 function 參數。 下面的例子:
int main(void)
{
    char s[] = "Hello world";

    printf("%s\n", reverse(s));
}

https://godbolt.org/z/fbo4nsn38

在您的代碼中,您推進指針str以計算其長度,但之后您忘記將其重置為開頭。 此外,您對 scanf 的調用應該傳遞str ,而不是它的地址。 此外,如果用戶輸入的字符串長度超過 19 個字符,scanf 將超出str的末尾。 試試這個:

#include <stdio.h>
#include <string.h>

void revstr(char str[])
{
    char temp;
    int size = strlen(str);
    for (int i = 0; i < size / 2; i++) {
        temp = str[i];
        str[i] = str[size - 1 - i];
        str[size - 1 - i] = temp;
    }
}

int main()
{
    char str[20];
    printf("enter a string: \n");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';
    revstr(str);
    printf("%s\n", str);
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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