簡體   English   中英

C函數,反向字符串

[英]C function, reverse string

我需要有關您從主要反向文本調用的功能的幫助。 但是,該程序可以“或多或少”運行,但是會崩潰。 這是代碼的樣子

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

void reverse(char * array, int numberOfChars) {
    int begin = 0;
    int end = 0;
    char temp;

    end = strlen(&array) - 1;
    printf("%s", &array);

    while (begin < end) {
        temp = array[begin];
        array[begin] = array[end];
        array[end] = temp;
        begin++;
        end--;
    }
}

int main() {
    reverse('supm', 4);
    return(0);
    getchar();
}

字符串被反轉為mpus,但隨后崩潰,顯然好像數組也只能接受4個字符,如果我將其更改為5並將整數值更改為5,則根本無法使用。 任何幫助,將不勝感激。

strlen(&array)printf("%s", &array); 錯了。 它們將通過指針而不是字符串的位置。 使用strlen(array)printf("%s", array);

reverse('supm', 4); 這也是錯誤的,因為此調用的第一個參數不是字符串,而是實現定義的整數。

請注意,只需將其更改為reverse("supm", 4); 無法使用,因為不允許修改字符串文字。

另外,最后一個getchar(); 將不會執行,因為它在return 0;

嘗試這個:

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

void reverse(char * array, int numberOfChars) {
    int begin = 0;
    int end = 0;
    char temp;

    end = strlen(array) - 1;
    printf("%s", array);

    while (begin < end) {
        temp = array[begin];
        array[begin] = array[end];
        array[end] = temp;
        begin++;
        end--;
    }
}

int main() {
    char supm[] = "supm";
    reverse(supm, 4);
    puts(supm); /* added this to see if this code is working well */
    return(0);
}

也許您應該使用參數numberOfChars而不是strlen(array)因為您傳遞了參數,但根本沒有使用它。

我突然想到了幾件事:

  1. strlen應該帶一個char* ,而您要傳遞一個char** 代替strlen(&array) ,使用strlen(array)
  2. printf類似的故事。 代替printf("%s", &array) ,使用printf("%s", array)
  3. 您的main中的字符串文字應該正確使用單引號,而應該使用雙引號。 您的'supm'應該是"supm" 您也不能修改字符串文字,因此您需要設置一個包含字符串的變量,然后傳遞該變量。
  4. 您在調用getchar之前return(0) 這意味着將永遠不會調用getchar
  5. numberOfChars未使用。 刪除該參數或使用它代替strlen

在您的功能reverse -

end = strlen(&array) - 1;
printf("%s", &array);

您將char **傳遞給strlen ,它需要一個const char *然后嘗試用%s打印一個char ** Jusr將array傳遞給這兩個函數。 main -

reverse('supm', 4);

如果您甚至執行"spum" ,這將是字符串literal,因此為常量(修改它會導致問題)。

改為這樣做-

char s[]="spum"; 
reverse(s, 4);

編譯器必須為這些語句發出警告,如果沒有,則啟用編譯器警告。

  1. array已經是一個指針了&array為您提供了一個指向該指針的指針。 因此,將strlen調用更改為:

     strlen(array); 
  2. 您需要在傳遞給函數之前定義字符串-否則,該字符串僅存在於函數內部,您將無法在外部訪問它。

     char mystr[] = "supm"; reverse(mystr, 4); printf("%s\\n", mystr); return 0; 

試試這個代碼,我已經解決了您所有的代碼問題。

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

void reverse(char * array, int numberOfChars) {
    int begin = 0;
    int end = 0;
    char temp;

    end = strlen(array) - 1;
    printf("%s\n", array);

    while (begin < end) {
        temp = array[begin];
        array[begin] = array[end];
        array[end] = temp;
        begin++;
        end--;
    }
}

int main() {
    char str[] ="sump";
    reverse(str, 4);
    puts(str);    
    return(0);

}

您可以從這段代碼的問題中學到什么?

void reverse(char *數組,int numberOfChars)/ *定義* /

reverse('supm',4); / *調用函數* /

比較這兩個定義,第一個參數是傳遞字符數組char *array但在調用時傳遞'sump''sump' 。現在,請記住除了字符以外,您還可以使用""因此這里應使用"sump"

結束= strlen(&array)-1;

參考strlen

它的參數是常量字符指針。 但是在這里,您傳遞了&array 。我想您認為&array&array的地址,但是對於數組array代表地址和array[i]代表值是錯誤的

getchar()

此功能用於讀取輸入,而不用於打印字符串。 參考getchar

對於打印反向輸出,您應該最后使用puts而不是getchar

在您的main功能中,行reverse('supm', 4); 有一些問題。 首先,它是一個字符常量,而不是字符串,因此您最終會將無效的指針值傳遞給reverse函數。 您可能打算使用"supm" ,它是一個字符串,並且與reverse函數期望的char *匹配。 但是, "supm"是字符串文字常量,因此盡管可以指向它,但不允許對其進行修改。 因此,您應該執行以下操作:

    char rev[] = "supm";
    reverse(rev, 4);

在這里, rev是由5個char的數組,初始化為{'s', 'u', 'p', 'm', '\\0'}

您當前未使用reversenumberOfChars參數,因此可以將其刪除。

暫無
暫無

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

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