未定义的输出(K& R 1.19)

时间:2016-04-18 13:04:04

标签: c output

我试图找出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");

}

问题是我有一个未定义的输出,像这样 Undefined Behavior

我试图弄明白,但对我来说没有意义。 提前感谢您的帮助。

4 个答案:

答案 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;的最后一个字符。是gnirttring反转。

然后还要注意使用\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;
}