我有这段 C 语言代码,我正在寻找的是将键盘输入的短语保存在另一个字符串中,但我不明白为什么它不能反过来工作。#包括
#include <string.h>
#include <ctype.h>
#define MAX 1000
int main (void)
{
int i,j,k;//Indices.
char frase[MAX],invertida[MAX],auxiliar[MAX];//Cadenas.
printf("Programa en el que introduces una frase para rescribirla al reves\n\n");
printf("Introduce tu frase: ");
gets(frase);
strcpy(auxiliar,frase);
j=strlen(frase);
i=0;k=0;
while(auxiliar[k]!='\0' && j>=0)
{
invertida[i]=frase[j];
invertida[i+1]='\0';
i++;k++;j--;
}
printf("La frase invertida es:\n%s",invertida);
return 0;
}
我知道如何向后打印原始字符串,但我不明白为什么当我尝试将其保存到另一个字符串时它不起作用。请帮忙。
“反转”的第一个字符将始终为空。
如果短语是“hello”,j 将为 4。但请记住,在 C 数组中,数组从零开始,所以
j[0] = 'h'
,j[1] = 'o'
,j[2] ='l'
,j[3] = 'a'
因此j[4] = '\0'
。在第一行中,
invertida[i] = frase[j]
第invertida[0] = frase[4]
一个字符保持为空。做那个
它会起作用。我建议你
invertida[i+1] = '\0';
在循环之外做,它的工作原理是一样的。您的代码中的问题。
我看到您的代码将循环
while
用于字符串反转过程,但通常情况并非如此。尽管使用循环确实可以while
工作,但一般规则是将这种类型的循环用于迭代次数未知的重复性任务,而循环for
用于那些迭代次数已知的重复性任务。在您的情况下,遵循一般规则,您应该使用循环for
。您使用三个1编队来完成可以用两个(原始链和反向链)完成的任务。出于某种原因,您认为您需要将原始数据复制到辅助1数组中以对其进行反转,这会花费更多的处理时间(调用
strcopy
花费O(n))以及花费更多的内存(您在辅助数组上花费了 1,000 多个字节)。您没有初始化变量,因此它们包含随机数据,因此您需要采取额外的步骤在 中添加字符串终止符,
invertida
您还通过过度处理处理器不必要地将其分配给循环的每一轮。你不应该使用单字母变量,在 80 和 90 年代的计算机屏幕支持 80 个字符宽度,节省屏幕空间是有意义的;现在这是荒谬的,只会让你和你的同行更难理解你的代码。
最后,当您可以在读取时找出长度时,您正在调用
strlen
(也是O(n) )来找出字符串的长度。提议。
使用
%n
您可以找出读取数据的大小,因此:但这会导致它读入空间,因此它不适用于句子。为避免这种情况,您可以使用与正则表达式
[colección de caracteres]
相同的catch :考虑到以上所有因素,您的代码可能如下所示:
您可以看到在Wandbox 三へ( へ՞ਊ ՞)へ ハッハッ.
1又称数组,或英文:array。
请注意, inv 是倒置的短语,我在 main 之外创建它,因为在数组的空白区域内会随机填充,这会导致它不仅显示短语,还显示许多特殊字符,在我迭代的同时以这样的方式,例如对于“你好”这个词:
这样我们就通过了两个句子,从前到后的反向和从后到前的句子