為什么我沒有得到任何輸出,甚至沒有錯誤,這樣我就可以弄清楚我應該做些什么改變。
我應該更改編譯器嗎?
請用簡單的話幫助我,非常感謝。
#include <stdio.h>
#include <string.h>
char* words[] = {"rar", "tokyo", "level", "prefix", "mom", "delhi", "naruto"};
int size = sizeof(words) / sizeof(words[0]);
void palindChecker(char **, int);
int main() {
palindChecker(words, size);
return 0;
}
void palindChecker(char **array, int len) {
int tempStrLen, tempStrLen1;
for (int i = 0; i < len; i ) {
tempStrLen = strlen(array[i]);
if (tempStrLen1 <= tempStrLen) {
tempStrLen1 = tempStrLen;
}
}
char tempStr[tempStrLen1];
for (int i = 0; i < len; i ) {
strcpy(tempStr, strrev(array[i]));
if (strcmp(strrev(tempStr), array[i]) == 0) {
printf("%s is palindrome\n", array[i]);
}
else {
printf("%s is not palindrome\n", array[i]);
}
}
}
uj5u.com熱心網友回復:
您的代碼存在多個問題:
tempStrLen1計算最大字串長度時未初始化- 一旦計算出最大字串長度,分配的陣列就太短了(記住:字串還需要一個終止符 0)
strrev()原地反轉字串,即修改傳遞的字串。這將不起作用,array[i]因為這些字串是常量并且被保護不被修改。- 即使它有效,代碼也假定原始字串沒有被修改。
下面的代碼解決了這些問題。
void palindChecker(char **array, int array_len) {
// calculate maximum string length
int str_len = 0;
for (int i = 0; i < array_len; i ) {
int len = strlen(array[i]);
if (str_len < len)
str_len = len;
}
char tempStr[str_len 1];
for (int i = 0; i < array_len; i ) {
// create modifiable copy
strcpy(tempStr, array[i]);
// reverse copy
strrev(tempStr);
if (strcmp(tempStr, array[i]) == 0) {
printf("%s is palindrome\n", array[i]);
}
else {
printf("%s is not palindrome\n", array[i]);
}
}
}
uj5u.com熱心網友回復:
tempStrLen1您需要在 for 回圈之前初始化變數
int tempStrLen, tempStrLen1;
for (int i = 0; i < len; i ) {
tempStrLen = strlen(array[i]);
if (tempStrLen1 <= tempStrLen) {
tempStrLen1 = tempStrLen;
}
}
像
int tempStrLen, tempStrLen1 = 0;
否則,該函式會呼叫未定義的行為。
您還需要使用另外一個元素定義可變長度陣列 tempStr
char tempStr[tempStrLen1 1];
您嘗試將非標準函式 strrev 應用于再次呼叫未定義行為的字串文字的函式的更嚴重錯誤
strcpy(tempStr, strrev(array[i]));
你需要改寫
strcpy(tempStr, array[i]);
strrev( tempStr );
注意確定一個字串是否代表回文,不需要創建它的副本。相反,你可以寫
for ( int i = 0; i < len; i )
{
size_ j = 0;
size_t n = strlen( array[i] );
while ( j < n / 2 && array[i][j] == array[i][n - j - 1] ) j;
if ( j == n / 2 ) {
printf("%s is palindrome\n", array[i]);
}
else {
printf("%s is not palindrome\n", array[i]);
}
}
uj5u.com熱心網友回復:
@Codo 回答的一個補充。您的函式中不需要兩個for回圈。
void palindChecker(char **array, int len)
{
for (int i = 0; i < len; i )
{
int tempStrLen = strlen(array[i]);
char tempStr[tempStrLen 1];
strcpy(tempStr, array[i]);
strrev(tempStr);
if (strcmp(tempStr, array[i]) == 0)
{
printf("%s is palindrome\n", array[i]);
}
else
{
printf("%s is not palindrome\n", array[i]);
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/468478.html
上一篇:如何計算兩個二維陣列的曼哈頓距離(或L1/城市街區)?
下一篇:帶解參考運算子的前綴和后綴
