我正在制作一个反转字符串并检查该字符串是否为回文的函数。当我使用像“abba”这样明显的回文测试函数时,函数说它不是回文。前弦和反弦也有不同的弦长!
#include <stdio.h>
#include <string.h>
char forward [] = "abba"; //The string to be reversed
int size = (sizeof(forward)/sizeof(forward[0]) - 1);
int j = 0;
char reverse [10];
void reverser(char forward []) {
printf("%s", "String forward: ");
for (int i = 0; i < size; i++) { //Function for printing out the forward string.
printf("%c", forward[i]);
}
printf("\n");
printf("%s", "String reversed: ");
for (int i = size, j = 0; i >= 0; --i, ++j) { //Function for reversing the string and printing it.
reverse[j] = forward[i];
printf("%c", reverse[j]);
}
printf("\n");
if (strcmp(forward, reverse) != 0) { //Using strcmp to check if the forward and reversed string are the same.
printf("Not a palindrome!\n");
}
else{
printf("A palindrome!\n");
}
printf("Forward string length: %d\n",strlen(forward));
printf("Reversed string length: %d\n",strlen(reverse));
}
int main () {
reverser(forward);
}
输出:
字符串转发:abba
字符串颠倒:abba
不是回文!
前弦长:9
反向字符串长度:0
答案 0 :(得分:1)
在这个循环中
for (int i = size, j = 0; i >= 0; --i, ++j) { //Function for reversing the string and printing it.
reverse[j] = forward[i];
printf("%c", reverse[j]);
}
当变量i
的初始值等于size
时,forward [i]是字符串的终止零
尝试以下循环实现
for ( int i = size, j = 0; i != 0; ++j) { //Function for reversing the string and printing it.
reverse[j] = forward[--i];
printf("%c", reverse[j]);
}
另外考虑到对于将存储运算符sizeof
或函数strlen
返回的值的变量,最好使用类型size_t
。
所以在这些陈述中
printf("Forward string length: %d\n",strlen(forward));
printf("Reversed string length: %d\n",strlen(reverse));
使用格式说明符%zu
代替%d
例如
printf("Forward string length: %zu\n",strlen(forward));
printf("Reversed string length: %zu\n",strlen(reverse));
这里的一些回答者说你必须对字符串reverse
进行零终止。但是它已经为零终止,因为它在任何函数之外声明,因此具有静态存储持续时间,因此默认情况下它是零初始化。
答案 1 :(得分:0)
我认为&#34;的第一个字母反转&#34;是&#39; \ 0&#39;。
将此行int size = (sizeof(forward)/sizeof(forward[0]) - 1);
改为int size = strlen(forward)
。
此外:
printf("%s", "String forward: ");
for (int i = 0; i < size; i++) { //Function for printing out the forward string.
printf("%c", forward[i]);
}
可以替换为printf("String forward : %s\n", forward);
答案 2 :(得分:0)
倒车时($OutputVariable = (Get-Process %processname% | Select-Object WS) | Out-String
),您将空字符放在第一个索引中。这就是每次失败的原因。
reverse[0]
应该是
for (int i = size, j = 0; i >= 0; --i, ++j) {
reverse[j] = forward[i];
}
for (int i = size - 1, j = 0; i >= 0; --i, ++j) {
reverse[j] = forward[i];
}
reverse[size] = '\0';
为5,表示sizeof(forward)/sizeof(forward[0])
。
size = 4
答案 3 :(得分:0)
反转代码由其中一个索引关闭,i
应从size-1
运行到0
,包括:
// Function for reversing the string.
for (int i = size, j = 0; i > 0;) {
reverse[j++] = forward[--i];
}
reverse[size] = '\0';
为避免更新2个不同的索引,您可以简化此循环:
// Function for reversing the string.
for (int i = 0; i < size; i++) {
reverse[i] = forward[size - 1 - i];
}
reverse[size] = '\0';
您的代码中还有许多其他问题:
forward
和size
是全局变量,但您也以同样的方式在函数reverser
中命名参数并使用全局size
,这可能是如果使用不同的参数调用则不合适。 size
甚至更糟糕的j
不应该是全局变量(!)
函数名reverser
与函数的作用不一致:打印其参数。
您可以使用%s
printf格式直接打印参数字符串。无需循环。
%d
不是strlen()
返回值的正确格式。投射为(int)strlen(forward)
或使用%zu
。