我创建了一个程序,它接受一个输入的字符串并向后输出字符串。我创建了一个计算字符串中字符数的函数。有了这些信息,我创建了另一个函数,将原始数组的第一个字符放在新数组的末尾。因此,当函数中的循环完成时,新数组包含原始数组的字母但向后。然而,我遇到了一些困难。我仍然对字符数组保持警惕,我不确定我是否正确使用它们。有人可以帮助我吗?
#include <stdio.h>
#define MAXLINE 1000
char backward(char str[], int count)
int count(char str[])
int main() {
char orig[MAXLINE];
int c;
scanf("%s", orig);
c = count(orig);
printf("%s", backward(orig, c));
return 0;
}
char backward(char str[], int count) {
char back[MAXLINE];
int i;
for(i = 0; i <= count; ++i) {
back[count] = str[i];
--count;
return back;
}
int count(char str[]) {
int i;
for (i = 0; str[i] != '\0'; ++i)
;
return i;
}
编辑:输入:让我们说“小型货车”。预期的产出将是“navinim”。还没有实际的输出。我收到了这个错误:
palindrome.c:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘int’
答案 0 :(得分:5)
你得到的错误是因为你的原型错了:
#include <stdio.h>
#define MAXLINE 1000
char backward(char str[], int count) /* missing ; */
int count(char str[]) /* missing ; */
int main() {
您还应该考虑将count()
替换为strlen(3)
头文件中的<string.h>
。标准库中充满了已经调试并且已知可以正常工作的实用程序 - 值得使用它们。 (是的,重新实施它们具有教育价值。但在这种情况下,请准备好用各种角落案例进行测试。)
答案 1 :(得分:2)
您的代码可能无法编译,因为您错过了backward()
中的右括号。
char backward(char str[], int count) {
char back[MAXLINE];
int i;
for(i = 0; i <= count; ++i) {
back[count] = str[i];
--count;
/** You should add a } character here! **/
return back;
}
MAJOR EDIT 1:
我试图编译你的代码,但它有很多问题。这是工作代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLINE 1000
char * backward(char * str);
int main() {
char orig[MAXLINE];
int c;
scanf("%s", orig);
printf("%s\n", backward(orig));
return 0;
}
char * backward(char * str) {
int count = strlen(str);
char * back = malloc(MAXLINE);
int i;
for(i = 0; i < count; i++)
{
back[count-i-1] = str[i];
}
back[count] = 0; // Add the null termination character.
return back;
}
当我运行此代码并输入“abcde”时,它会输出“edcba”。如果您对此如何运作有任何具体问题,请与我们联系。我删除了count()
函数,因为它与strlen()
重复,我将调用移到了strlen()
内的backward()
,以建立{{1}的接口功能更简单。
使你的代码失败的另一件事是你在for循环中递减backward()
,这会导致你的for循环比你想要的更早终止。
答案 2 :(得分:1)
此行有一个错误:
back[count] = str[i];
count
不是字符串的最后一个字符,而是'\0'
字符。
您还要返回一个堆栈变量 - 这不会起作用。
你应该反转字符串:
for(i = 0; i <= count; ++i) {
--count;
char tmp = str[i];
str[i] = str[count];
str[count] = tmp;
}
然后您可以返回str
。
答案 3 :(得分:0)
你的程序有很多错误。首先,在向后声明原始数据并计数时,你错过了分号(;)。然后你还没有用后面的大括号(})关闭向后函数中的for循环。 但最大的三个问题是 1.您已将向后函数定义为char数据类型,但是您将返回指向char数据类型数组的指针 2.您正在访问[count]而不是返回[count-1]。假设字符串是小型货车。计数将保持7.最后一个字符位于第6个位置而不是第7个因为在数组下标中从0开始而不是1.并且返回[count]将指向空字符,即'\ 0' 3.您正在递增i并递减计数并检查i&lt; = count。这将只处理你的字符串直到它的中间。
尽管David Greyson发布了正确的程序,但由于他已经删除了count函数并引入了strlen和malloc函数,我只是通过纠正算法再次发布程序
#include <stdio.h>
#define MAXLINE 1000
char *backward(char str[], int count);
int count(char str[]);
int main() {
char orig[MAXLINE];
int c;
scanf("%s", orig);
c = count(orig);
printf("%s", backward(orig, c));
return 0;
}
char *backward(char str[], int count) {
char back[MAXLINE];
int i;
for(i = 0; i < count; ++i) {
back[count-i-1] = str[i];
}
back[i] = '\0';
return back;
}
int count(char str[]) {
int i;
for (i = 0; str[i] != '\0'; ++i)
;
return i;
}
答案 4 :(得分:0)
您可以创建一个字符指针,然后将字符串的长度添加到此指针,它应该char *reverse = (char *)name
,然后添加reverse = reverse + strlen(name) -1
。
然后你可以通过字符串的开头使用while循环。整个代码看起来,
void main(void)
{
char *name = "Kernel";
char *reverse = (char *)name;
reverse = reverse + strlen(name) - 1;
while(*reverse)
printf("%c", *reverse);
}
答案 5 :(得分:0)
#include<Stdio.h>
#include<string.h>
int main()
{
size_t i,j;
char arr[10]={'\0'};//orignal array
char arr2[10]={'\0'};//it's reverse to be
gets(arr);//prompt
strncpy(arr2,arr,10);//copy
strrev(arr2);
if(strncmp(arr,arr2)==0)
printf("plaindrom");
return 0;
}