我正在尝试编写一个我输入字符串的代码,然后我将其反转。 I.e。:"诺基亚"到" aikon"。
我已经有了某种方式,但现在我想使用函数strlen()
来获取原始字符串的长度,并根据该长度创建新的长度。
以下是代码:
void main(void)
{
char palavra[10];
char palavra2[10];
int i;
int k;
printf("Introduza uma string: \n");
scanf("%[^\n]", palavra);
for( i = 0, k = strlen(palavra) - 1 ; i <= k; i++, k--)
{
palavra2[k] = palavra[i];
}
printf("\nString invertida: %s", palavra2);
}
但是我从printf()
得到的只是&#34;?&#34;。我做错了什么?
答案 0 :(得分:6)
您的循环索引以相反的方式运行,因此它们在中间相遇,并且当SETLOCAL
for %%a in (*.mp4) do (
MediaInfo --Inform="Audio;%%Format%%" "%%a">codec.txt
SET /p codec=<codec.txt
DEL codec.txt
ECHO %codec%
)
pause
时循环停止:一半的字符串未被反转。只需针对i <= k
i
另外,您必须以空字符串终止字符串:
strlen(palavra)
(并且您最好存储int len=strlen(palavra);
for( i = 0, k = len - 1 ; i < len; i++, k--)
{
palavra2[k] = palavra[i];
}
palavra2[len]='\0';
的值,因此您只需计算一次)
答案 1 :(得分:2)
尝试这个简单的反向功能:
/* reverse: reverse string s in place */
void reverse(char s[])
{
int c, i, j;
for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
将其集成到您的代码中:
void main(void)
{
char palavra[10];
int c, i, j;
/* read the string */
printf("Introduza uma string: \n");
scanf("%[^\n]", palavra);
/* null-terminate the string */
palavra[strlen(palavra)] = '\0';
/* reverse the string */
for (i = 0, j = strlen(palavra)-1; i < j; i++, j--) {
c = palavra[i];
palavra[i] = palavra[j];
palavra[j] = c;
}
printf("\nString invertida: %s", palavra);
}
答案 2 :(得分:1)
上面的答案非常好,我只是通过使用位操作对其进行优化来增强代码。
#include<stdio.h>
int main(void)
{
char palavra[10];
printf("Introduza uma string: \n");
scanf("%[^\n]", palavra);
char *start=palavra;
int len = strlen(palavra);
char *end = (palavra+len-1);
while(start < end )
{
*start = *start ^ *end;
*end = *end ^ *start;
*start = *end ^ *start;
start++;
end--;
}
printf("\nString invertida: %s\n", palavra);
return 0;
}
最好使用Bitwise运算符并将迭代次数减少一半,进行内部交换
答案 3 :(得分:-1)
您可以使用递归功能。我正在使用字符串类(特定于C ++),您可以将其更改为char *。
void reverse(string& str, int i, int len)
{
if(i<len)
reverse(str, i+1, len-1);
swap(str[i], str[len]);
}
来电者 - reverse(str, 0, str.length()-1)