C:回文:不同的strlen值
我正在做一个函数,它反转一个字符串并检查这个字符串是否是回文。当我用一个明显的回文(如“abba”)测试函数时,函数说它不是回文。此外,正向字符串和反向字符串的长度也不同C:回文:不同的strlen值,c,string,palindrome,strcmp,reversing,C,String,Palindrome,Strcmp,Reversing,我正在做一个函数,它反转一个字符串并检查这个字符串是否是回文。当我用一个明显的回文(如“abba”)测试函数时,函数说它不是回文。此外,正向字符串和反向字符串的长度也不同 #include <stdio.h> #include <string.h> char forward [] = "abba"; //The string to be reversed int size = (sizeof(forward)/sizeof(forward[0]) - 1); int
#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);
}
#包括
#包括
char forward[]=“abba”//要反转的字符串
int size=(sizeof(forward)/sizeof(forward[0])-1);
int j=0;
字符反转[10];
无效反向器(字符向前[]){
printf(“%s”,“字符串向前:”);
for(int i=0;i=0;--i,++j){//函数,用于反转字符串并打印它。
反向[j]=正向[i];
printf(“%c”,反面[j]);
}
printf(“\n”);
如果(strcmp(正向,反向)!=0){//使用strcmp检查正向和反向字符串是否相同。
printf(“不是回文!\n”);
}
否则{
printf(“回文!\n”);
}
printf(“前向字符串长度:%d\n”,strlen(前向));
printf(“反向字符串长度:%d\n”,strlen(反向));
}
int main(){
反向器(正向);
}
输出:字符串转发:abba
字符串反转:abba
不是回文
正向字符串长度:9
反向字符串长度:0
我认为“Reversed”的第一个字符是“\0” 替换此行
int size=(sizeof(forward)/sizeof(forward[0])-1)代码>由int size=strlen(向前)
生成
此外:
printf(“%s”,“字符串向前:”);
for(int i=0;i
可替换为printf(“字符串转发:%s\n”,转发)
在反转时,您正在将空字符放在第一个索引中(反转[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';
sizeof(forward)/sizeof(forward[0])
是5,意思是size=4
forward[0] = 'a'
forward[1] = 'b'
forward[2] = 'b'
forward[3] = 'a'
forward[4] = '\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';
要避免更新两个不同的索引,可以简化此循环:
// Function for reversing the string.
for (int i = 0; i < size; i++) {
reverse[i] = forward[size - 1 - i];
}
reverse[size] = '\0';
//用于反转字符串的函数。
对于(int i=0;i
代码中还有许多其他问题:
forward
和size
是全局变量,但您也可以在functionreverser
中以相同的方式命名参数,并在其中使用全局size
,如果使用不同的参数调用,则可能不合适size
甚至更糟的j
不应该是全局变量(!)
- 函数名
reverser
与函数的功能不一致:打印其参数
- 您可以使用
%s
printf格式直接打印参数字符串。不需要循环
%d
不是strlen()
返回值的正确格式。可以转换为(int)strlen(forward)
或使用%zu
在此循环中
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]是变量i
的初始值等于size
尝试以下循环实现
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
返回的值的变量,最好使用typesize\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));
这里的一些回答者说,您必须以零结尾字符串反向
。但是,它已经以零结尾,因为它是在任何函数之外声明的,因此具有静态存储持续时间,因此默认情况下它是零初始化的。请正确缩进代码,我无法理解它。int I=size
-->int I=size-1
这是什么?为什么斯特伦不在这里?int size=(sizeof(forward)/sizeof(forward[0])-1)@YurySchkatula:因为size
是一个全局变量:(.真正的问题是为什么size
是一个全局变量?您应该通过从这些括号中删除j++
和--i
并将它们放在for中的适当位置,使代码更容易理解-loop@Smac89:实际上我是故意放在那里的。向下循环不应该使用=0
,因为test不适用于无符号变量。在测试表达式中使用索引前递减或后递减是惯用的,尽管对初学者来说很容易混淆。建议的替代方法更简单,更不容易出错。还要注意,reverse
不是以null结尾的。@chqrlie为什么决定这样做?因为即使s由于reverse
是一个全局变量,并且操作只发生一次,因此没有严格的必要,我相信OP不知道他的代码不能以更一般的方式使用。@chqrlie您说过我应该注意reverse不是以null结尾的。但是这是一个错误的陈述。:)好的。让我们这样说吧:这将是一个很好的建议,让OP提醒他null terminatereverse
,这样函数就可以在一般情况下工作。显然,使用全局变量size
也不是一个好的做法,10字节的任意大小也是值得怀疑的。。。