C:回文:不同的strlen值
C: Palindrome: Different strlen-values
我正在制作一个函数来反转字符串并检查该字符串是否为回文。当我用像 "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
我认为 "reversed" 的第一个字符是 '\0'。
将这一行 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);
您在反转时将空字符放在第一个索引中 (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] = '[=11=]';
sizeof(forward)/sizeof(forward[0])
是 5 即 size = 4
.
forward[0] = 'a'
forward[1] = 'b'
forward[2] = 'b'
forward[3] = 'a'
forward[4] = '[=12=]'
反向代码在其中一个指数上偏离了一个,i
应该运行从size-1
到0
包括:
// Function for reversing the string.
for (int i = size, j = 0; i > 0;) {
reverse[j++] = forward[--i];
}
reverse[size] = '[=10=]';
为避免更新 2 个不同的索引,您可以简化此循环:
// Function for reversing the string.
for (int i = 0; i < size; i++) {
reverse[i] = forward[size - 1 - i];
}
reverse[size] = '[=11=]';
您的代码中还有许多其他问题:
forward
和 size
是全局变量,但您也以相同的方式命名函数 reverser
中的参数并使用全局变量 size
在那里,如果用不同的参数调用,这可能是不合适的。 size
更糟的是 j
不应该是全局变量 (!)
函数名称reverser
与函数的作用不一致:打印其参数。
你可以直接用%s
printf 格式打印参数字符串。不需要循环。
%d
不是 strlen()
return 值的正确格式。转换为 (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]);
}
forward[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
返回的值的变量,最好使用类型 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
。然而,它已经是零终止的,因为它是在任何函数之外声明的,因此它具有静态存储持续时间,因此默认情况下它是零初始化的。
我正在制作一个函数来反转字符串并检查该字符串是否为回文。当我用像 "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
我认为 "reversed" 的第一个字符是 '\0'。
将这一行 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);
您在反转时将空字符放在第一个索引中 (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] = '[=11=]';
sizeof(forward)/sizeof(forward[0])
是 5 即 size = 4
.
forward[0] = 'a'
forward[1] = 'b'
forward[2] = 'b'
forward[3] = 'a'
forward[4] = '[=12=]'
反向代码在其中一个指数上偏离了一个,i
应该运行从size-1
到0
包括:
// Function for reversing the string.
for (int i = size, j = 0; i > 0;) {
reverse[j++] = forward[--i];
}
reverse[size] = '[=10=]';
为避免更新 2 个不同的索引,您可以简化此循环:
// Function for reversing the string.
for (int i = 0; i < size; i++) {
reverse[i] = forward[size - 1 - i];
}
reverse[size] = '[=11=]';
您的代码中还有许多其他问题:
forward
和size
是全局变量,但您也以相同的方式命名函数reverser
中的参数并使用全局变量size
在那里,如果用不同的参数调用,这可能是不合适的。size
更糟的是j
不应该是全局变量 (!)函数名称
reverser
与函数的作用不一致:打印其参数。你可以直接用
%s
printf 格式打印参数字符串。不需要循环。%d
不是strlen()
return 值的正确格式。转换为(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]);
}
forward[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
返回的值的变量,最好使用类型 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
。然而,它已经是零终止的,因为它是在任何函数之外声明的,因此它具有静态存储持续时间,因此默认情况下它是零初始化的。