我正在编写C程序,从标准输入读取一行字符输入。然后以相反的顺序输出字符行。
它不打印反转数组,而是打印常规数组。
任何人都可以帮助我吗? 我究竟做错了什么?
main()
{
int count;
int MAX_SIZE = 20;
char c;
char arr[MAX_SIZE];
char revArr[MAX_SIZE];
while(c != EOF)
{
count = 0;
c = getchar();
arr[count++] = c;
getReverse(revArr, arr);
printf("%s", revArr);
if (c == '\n')
{
printf("\n");
count = 0;
}
}
}
void getReverse(char dest[], char src[])
{
int i, j, n = sizeof(src);
for (i = n - 1, j = 0; i >= 0; i--)
{
j = 0;
dest[j] = src[i];
j++;
}
}
答案 0 :(得分:4)
你有很多问题。第一个是getReverse()
在main()
中使用getReverse()
时没有原型。您应该提供原型,或者只是将main()
移到main()
之上,以便c
知道。
第二个事实是你在输入每个字符后试图反转字符串,并且你的输入法不太正确(它在获得一个字符之前检查一个不确定的count = 0;
c = getchar();
while (c != EOF) {
arr[count++] = c;
c = getchar();
}
arr[count] = '\0';
)。这样的事情会更好:
count = 0;
c = getchar();
while ((c != '\n') && (c != EOF)) {
arr[count++] = c;
c = getchar();
}
arr[count] = '\0';
这将为您提供一个正确的C字符串,尽管最后一行有换行符,甚至可能是多行字符串,它与您的规范不匹配(“从标准输入读取一行字符”) 。如果您想要新行或文件结束来终止输入,您可以改为使用它:
c
最重要的是,int
实际上应该是char
,而不是EOF
,因为它必须能够存储每个可能的字符 plus getReverse()
标记。
你的sizeof
函数也有问题,主要是因为它没有在数组末尾放置一个结束字符串标记,而且因为它使用了错误的大小(strlen
而不是{ {1}})并且因为它似乎每次循环都重新初始化j
。无论如何,它可以大大简化:
void getReverse (char *dest, char *src) {
int i = strlen(src) - 1, j = 0;
while (i >= 0) {
dest[j] = src[i];
j++;
i--;
}
dest[j] = '\0';
}
或者,一旦你是一个熟练的编码员:
void getReverse (char *dest, char *src) {
int i = strlen(src) - 1, j = 0;
while (i >= 0)
dest[j++] = src[i--];
dest[j] = '\0';
}
如果您需要一个主程序,它为每行提供反转字符,您可以使用以下内容执行此操作:
int main (void) {
int count;
int MAX_SIZE = 20;
int c;
char arr[MAX_SIZE];
char revArr[MAX_SIZE];
c = getchar();
count = 0;
while(c != EOF) {
if (c != '\n') {
arr[count++] = c;
c = getchar();
continue;
}
arr[count] = '\0';
getReverse(revArr, arr);
printf("'%s' => '%s'\n", arr, revArr);
count = 0;
c = getchar();
}
return 0;
}
,在样本运行中显示:
pax> ./testprog
hello
'hello' => 'olleh'
goodbye
'goodbye' => 'eybdoog'
a man a plan a canal panama
'a man a plan a canal panama' => 'amanap lanac a nalp a nam a'
答案 1 :(得分:3)
每次while循环运行时,'count'变量都会变为0。
答案 2 :(得分:1)
答案 3 :(得分:0)
检查出来
#include <stdio.h>
#include <ctype.h>
void getReverse(char dest[], char src[], int count);
int main()
{
// *always* initialize variables
int count = 0;
const int MaxLen = 20; // max length string, leave upper case names for MACROS
const int MaxSize = MaxLen + 1; // add one for ending \0
int c = '\0';
char arr[MaxSize] = {0};
char revArr[MaxSize] = {0};
// first collect characters to be reversed
// note that input is buffered so user could enter more than MAX_SIZE
do
{
c = fgetc(stdin);
if ( c != EOF && (isalpha(c) || isdigit(c))) // only consider "proper" characters
{
arr[count++] = (char)c;
}
}
while(c != EOF && c != '\n' && count < MaxLen); // EOF or Newline or MaxLen
getReverse( revArr, arr, count );
printf("%s\n", revArr);
return 0;
}
void getReverse(char dest[], char src[], int count)
{
int i = count - 1;
int j = 0;
while ( i > -1 )
{
dest[j++] = src[i--];
}
}
答案 4 :(得分:0)
处理字符串是C中错误的丰富来源,因为即使是复制和修改等简单操作也需要考虑分配和存储问题。通过将输入和输出视为字符串而不是字符的流,并依赖递归和本地存储来处理所有分配,可以大大简化这个问题。
以下是一个完整的程序,它将读取一行标准输入并将其反向打印到标准输出,输入的长度仅受堆栈增长的限制:
int florb (int c) { return c == '\n' ? c : putchar(florb(getchar())), c; }
main() { florb('-'); }
答案 5 :(得分:0)
..或查看此
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
char *my_rev(const char *source);
int main(void)
{
char *stringA;
stringA = malloc(MAX); /* memory allocation for 100 characters */
if(stringA == NULL) /* if malloc returns NULL error msg is printed and program exits */
{
fprintf(stdout, "Out of memory error\n");
exit(1);
}
else
{
fprintf(stdout, "Type a string:\n");
fgets(stringA, MAX, stdin);
my_rev(stringA);
}
return 0;
}
char *my_rev(const char *source) /* const makes sure that function does not modify the value pointed to by source pointer */
{
int len = 0; /* first function calculates the length of the string */
while(*source != '\n') /* fgets preserves terminating newline, that's why \n is used instead of \0 */
{
len++;
*source++;
}
len--; /* length calculation includes newline, so length is subtracted by one */
*source--; /* pointer moved to point to last character instead of \n */
int b;
for(b = len; b >= 0; b--) /* for loop prints string in reverse order */
{
fprintf(stdout, "%c", *source);
len--;
*source--;
}
return;
}
Output looks like this:
Type a string:
writing about C programming
gnimmargorp C tuoba gnitirw