我试图找出K& R的练习1.19。
写一个反转字符串s的函数reverse(s)。 用它来编写一个程序,一次一行地反转它的输入
这是我的代码
#include <stdlib.h>
#include <stdio.h>
#define MAX 150
void reverse(char s[]);
int main()
{
int c, i;
char string[MAX];
i=0;
while((c=getchar())!= EOF){
while((c=getchar()) != '\n'){
string[i] = c;
i++;
}
reverse(string);
}
return 0;
}
void reverse(char s[]){
int i, j;
for(i=0; i<MAX-1; i++){
if(s[i] == '\n')
break;
}
for(j=i;j>=0;j--)
printf("%c", s[j]);
printf("\n");
}
我试图弄明白,但对我来说没有意义。 提前感谢您的帮助。
答案 0 :(得分:1)
我建议你代替这些循环 -
while((c=getchar())!= EOF){
while((c=getchar()) != '\n'){
试试这个 -
while((c=getchar()) != '\n' && c!=EOF){
在调用函数之后的这个循环之后 -
string[i]='\0'; // append '\0'
在功能reverse
中,而不是检查'\n'
检查'\0'
-
for(i=0; s[i]!='\0'; i++){ //you use it to get length of string
}
/* Or better to get length use strlen() from <string.h> */
答案 1 :(得分:1)
您的代码中存在多个问题。
首先,你吞下&#34;你的EOF检查的第一个字符;写入数组的第一个实际上是第二个(如果你输入string^ it would copy
tring`到缓冲区)。
然后,无论包含的字符串长度如何,都会反转完整缓冲区(150个字符)。你看到的垃圾只是&#34;休息&#34;您还要反转的缓冲区。注意&#34;垃圾&#34;的最后一个字符。是gnirt
,tring
反转。
然后还要注意使用\0
正确终止字符串。
答案 2 :(得分:0)
尝试替换
while((c=getchar())!= EOF){
while((c=getchar()) != '\n'){
string[i] = c;
i++;
}
使用:
while(((c=getchar())!= EOF) && (c != '\n')){
string[i] = c;
i++;
string[i] = '\0'
}
答案 3 :(得分:0)
#include <stdio.h>
#define MAX_ARRAY_SIZE 50
void Reverse(char string[]);
void Reverse(char string[])
{
int stringSize = 0;
我使用while循环迭代字符串数组并计算其长度
while (string[stringSize] != '\0')
{
stringSize++;
}
int i = 0;
我取消stringSize的增量,所以当它在结尾打印出来时,它不包含NULL终止符('\ 0')
stringSize -= 1;
for (i = stringSize; i >= 0; i--)
{
printf("%c", string[i]);
}
printf("\n");
}
int main(int argc, char *argv[])
{
int i = 0;
int c = 0;
char string[MAX_ARRAY_SIZE];
检查getchar是否为EOF或c是换行符('\ n')
while ((c = getchar()) != EOF && c != '\n')
{
string[i] = c;
i++;
}
将string [i]设置为空行字符,因此它不会反向打印整个数组,只包含包含字符串的部分
string[i] = '\0';
Reverse(string);
return 0;
}