我已完成以下函数来反转字符串:
char* reverseString(char *original_string)
{
int length = strlen(original_string);
char *end_of_string = original_string + (length - 1);
char *reversed_string = malloc(sizeof(char) * length);
int count = 0;
int top_limit = length;
while (count < length) {
reversed_string[count] = end_of_string[top_limit];
top_limit--;
count++;
}
return reversed_string;
}
我计划的策略是将指针放在原始字符串的末尾,然后向后复制到新字符串中。我不确定我在这里做错了什么,但在做的时候:
char* prova = "hello";
char* reversed_string;
reversed_string = reverseString(prova);
printf("%d", strlen(reversed_string));
它没有显示正确的长度,在编译时我得到以下警告:
test.c:46: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘size_t’
答案 0 :(得分:4)
你需要为'\ 0'多一个字符,并在最后复制它:
char* reverseString(char *original_string)
{
int length = strlen(original_string);
int top_limit = length-1;
//char *end_of_string = original_string + top_limit;
char *reversed_string = malloc(sizeof(char) * (1+length));
int count = 0;
while (count < length) {
reversed_string[count] = original_string[top_limit];
//reversed_string[count] = *(end_of_string--) ;
top_limit--;
count++;
}
reversed_string[count] = '\0';
return reversed_string;
}
答案 1 :(得分:2)
strlen
返回的类型为size_t
,这是一种无符号类型。使用%d
格式打印它是一种未定义的行为。您可以在C99中使用%zu
,也可以在C89中使用%u
并转换为unsigned int
。
#include <string.h>
/* C89 */ printf("%u\n", (unsigned int)strlen(reversed_string));
/* C99 */ printf("%zu\n", strlen(reversed_string));
C11(n1570),§7.19通用定义
<stddef.h>
size_t
,这是sizeof运算符[...]的结果的无符号整数类型。
您的算法也是错误的,因为您同时使用end_of_string
和top_limit
。您应该选择两种解决方案中的一种。
#include <string.h>
char *reverseString(char *original_string)
{
size_t length = strlen(original_string);
char *reversed_string = malloc(length + 1);
size_t start;
size_t end;
for (start = 0, end = length - 1; start < length; start++, end--)
{
reversed_string[start] = original_string[end];
}
reversed_string[start] = '\0';
return reversed_string;
}
答案 2 :(得分:1)
strlen
返回size_t
,因此您需要使用其他格式说明符
printf("%zu", strlen(reversed_string));
或(对于短sizeof(int)
字节的字符串)投射长度
printf("%d", (int)strlen(reversed_string));
答案 3 :(得分:0)
使用%u
作为格式说明符,而不是%d
printf("%u", strlen(reversed_string));