[英]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)
因為您傳遞了參數,但根本沒有使用它。
我突然想到了幾件事:
char*
,而您要傳遞一個char**
。 代替strlen(&array)
,使用strlen(array)
。 printf
類似的故事。 代替printf("%s", &array)
,使用printf("%s", array)
。 'supm'
應該是"supm"
。 您也不能修改字符串文字,因此您需要設置一個包含字符串的變量,然后傳遞該變量。 getchar
之前return(0)
。 這意味着將永遠不會調用getchar
。 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);
編譯器必須為這些語句發出警告,如果沒有,則啟用編譯器警告。
array
已經是一個指針了&array
為您提供了一個指向該指針的指針。 因此,將strlen調用更改為:
strlen(array);
您需要在傳遞給函數之前定義字符串-否則,該字符串僅存在於函數內部,您將無法在外部訪問它。
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'}
。
您當前未使用reverse
的numberOfChars
參數,因此可以將其刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.