我试图在C中反转一个字符串,我能够完成这个但不是没有我不太了解的副作用。这是我的代码来反转一个字符串:
void reverseString(char *toReverse, char *reverse) {
int i = strlen(toReverse);
int counter = 0;
for (i; toReverse[counter] != '\0'; i--) {
reverse[i] = toReverse[counter];
counter++;
}
}
int main(int argc, char *argv[]) {
char reverse[strlen(argv[1]) + 1];
reverse[strlen(reverse)] = '\0';
reverseString(argv[1], reverse);
printf("The reverse string is '%s'", reverse);
}
当给出一个字符串时,这正确地反转了字符串,但也添加了一些额外的数据,例如:
给定字符串abc123
,返回字符串321cbaub◄¥u"ñç«
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:2)
您应在\0
字符串中设置空终止reverse
,以printf
格式使用%s
来打印正确反转的字符串。
void reverseString(char* toReverse, char* reverse) {
int i = strlen(toReverse);
int counter = 0;
for (i; toReverse[counter] != '\0'; i--) {
reverse[i] = toReverse[counter];
counter++;
}
reverse[counter] = '\0'; //add this
}
此外,有时对于动态分配的东西,最好使用malloc:
reverse = (char*)malloc(i + 1);
变成这样的东西:
void reverseString(char* toReverse, char* reverse) {
int i = strlen(toReverse);
int counter = 0;
reverse = (char*)malloc(i + 1);
for (i; toReverse[counter] != '\0'; i--) {
reverse[i] = toReverse[counter];
counter++;
}
reverse[counter] = '\0'; //add this
}
答案 1 :(得分:1)
我会说reverse[counter] = '\0';
在自己的函数中添加它。
这看起来像
void reverseString(char* toReverse, char* reverse) {
int i = strlen(toReverse);
int counter = 0;
for (i; toReverse[counter] != '\0'; i--)
{
reverse[i] = toReverse[counter];
counter++;
}
reverse[counter] = '\0'; //add this
}
这有效!
答案 2 :(得分:1)
您的代码有几个问题:
reversed
中为main
设置空终结符的方式不正确,因为strlen(reverse)
仍然未初始化时使用reverse
。这是您获得垃圾输出的主要原因,因为空终止符未设置为正确的偏移量,但这是未定义的行为,将未初始化的数组传递给strlen
可能会产生更糟糕的后果。reverseString
中设置空终止符。i
,否则您创建的反向字符串向右移动了一个位置。printf
格式字符串main
应该返回0
。以下是更正后的版本:
void reverseString(const char *toReverse, char *reverse) {
int i = strlen(toReverse);
int counter = 0;
reverse[i] = '\0'; /* set the null terminator */
while (toReverse[counter] != '\0') {
reverse[--i] = toReverse[counter++];
}
}
int main(int argc, char *argv[]) {
char reverse[strlen(argv[1]) + 1];
reverseString(argv[1], reverse);
printf("The reverse string is '%s'\n", reverse);
return 0;
}
答案 3 :(得分:0)
你的字符串不是以空值终止的,这就是你在反向字符串后得到垃圾的原因。
因此,您应首先在reverse[i+1]=0;
中进行reverseString
。