Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:回文:不同的strlen值_C_String_Palindrome_Strcmp_Reversing - Fatal编程技术网

C:回文:不同的strlen值

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

我正在做一个函数,它反转一个字符串并检查这个字符串是否是回文。当我用一个明显的回文(如“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);      
}
#包括
#包括
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
    是全局变量,但您也可以在function
    reverser
    中以相同的方式命名参数,并在其中使用全局
    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
返回的值的变量,最好使用type
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));

这里的一些回答者说,您必须以零结尾字符串
反向
。但是,它已经以零结尾,因为它是在任何函数之外声明的,因此具有静态存储持续时间,因此默认情况下它是零初始化的。

请正确缩进代码,我无法理解它。
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 terminate
reverse
,这样函数就可以在一般情况下工作。显然,使用全局变量
size
也不是一个好的做法,10字节的任意大小也是值得怀疑的。。。