在C编程中反转一个数组

时间:2016-04-04 01:57:23

标签: c arrays reverse

我被困在我正在处理的一段代码上。我需要使用argc和argv []参数接收N个输入。然后N个输入将允许用户输入那么多句子。对于每个句子,我的代码应该反转句子中的每个单词。目前,我的代码将采用N值和句子,但不会打印反向句子。相反,它会打印一个空行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define SIZE 80

void get_input(char *line){
 fgets(line, SIZE, stdin);
 char *ptr = strchr(line, '\n');
 if (ptr){
     *ptr = '0'; }
}

 void reverse(char *line){
 char copy[SIZE];
 char word[SIZE];
 memset(copy, 0, SIZE);
 int line_len = strlen(line);
 int word_len = 0;
 int i;
 for(i=line_len; i<=0; --i){
     if(line[i] == ' ' && word_len > 0){
        memset(word, 0, SIZE);
        strncpy(word, line + i + 1, word_len);
        strcat(copy, word);
        strcat(copy, " ");
        word_len = 0;
     }else if(isalnum(line[i]) || line[i] == '\'')
          {word_len++;}
  }
  if(word_len>0){
     memset(word, 0, SIZE);
     strncpy(word, line, word_len);
     strcat(copy, word);}
     strcpy(line, copy);
}

int main(int argc, char *argv[]){
 int N = (int)strtol(argv[1], NULL, 10);
 if(N<0){
         printf("ERROR: Please provide an integer greater than or equal to 0\n");
         return 0;
        }
 if(N>SIZE){ printf("ERROR: Please provide an integer less than or equal to 80\n");
             return 0;
           }
     char line[SIZE];
     int i;
     for(i=0;i<N;i++){
                      get_input(line);
                      reverse(line);
                      printf("%s\n", line);
                     }
 return 0;
}

示例输入:

  

1

     

狐狸跳过日志

示例所需输出:

  

记录跳过的狐狸

当前输出:

  

4 个答案:

答案 0 :(得分:2)

您放置<=而不是>=

for(i = line_len; i <= 0; --i) {

答案 1 :(得分:0)

一个简单的愚蠢错误:

for(i=line_len; i<=0; --i){

这个循环有什么作用?好吧,首先它将i设置为line_len。然后它会在i小于或等于零时循环,并且在每个循环结束时它会将i减少一个。

如果i为零,这将循环很长时间(直到line_len溢出),否则它将不会循环(因为i将大于0)。

您可能需要>=而不是<=

你也可能意味着i=line_len-1而不是i=line_len,但这很难说。

答案 2 :(得分:0)

编辑:将for循环中的i&lt; = 0更改为i&gt; = 0.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define SIZE 80

void get_input(char *line){
 fgets(line, SIZE, stdin);
 char *ptr = strchr(line, '\n');
 if (ptr){
     *ptr = ' '; }
}

void reverse(char *line){
 char copy[SIZE];
 char word[SIZE];
 memset(copy, 0, SIZE);
 int line_len = strlen(line);
 int word_len = 0;
 int i;
 for(i=line_len; i>=0; --i){
     if(line[i] == ' ' && word_len > 0){
        memset(word, 0, SIZE);
        strncpy(word, line + i + 1, word_len);
        strcat(copy, word);
        strcat(copy, " ");
        word_len = 0;
     }else if(isalnum(line[i]) || line[i] == '\'')
          {word_len++;}
 }
  if(word_len>0){
     memset(word, 0, SIZE);
     strncpy(word, line, word_len);
     strcat(copy, word);}
     strcpy(line, copy);
}

int main(int argc, char *argv[]){
 int N = (int)strtol(argv[1], NULL, 10);
 if(N<0){
         printf("ERROR: Please provide an integer greater than or equal to 0\n");
         return 0;
        }
 if(N>SIZE){ printf("ERROR: Please provide an integer less than or equal to 80\n");
             return 0;
           }
     char line[SIZE];
     int i;
     for(i=0;i<N;i++){
                      get_input(line);
                      reverse(line);
                      printf("%s\n", line);
                     }
 return 0;
}

答案 3 :(得分:0)

非常好的逆转尝试。但是,你可能会比它需要的更难。如果您只是颠倒参数的顺序,您可以反向打印它们,或者如果您想从反向参数中构建一个字符串,只需将它们与strcat以相反的顺序连接起来。有很多方法可以做到,但一个相当直接的方法是:

#include <stdio.h>
#include <string.h>

#define MAXC 1024

int main (int argc, char **argv) {

    char string[MAXC] = "";
    int i, len = 0;

    for (i = argc - 1; i && len + strlen (argv[i]) + 2 < MAXC; i--) {
        strcat (string, argv[i]);
        strcat (string, " ");
        len = strlen (string);
    }
    printf ("%s\n", string);

    return 0;
}

只是从最后一个参数index argc - 1开始,然后只要参数索引大于0i)并且您在允许的字符数{{}范围内1}}(len + strlen (argv[i]) + 2 < MAXC允许 nul-terminator +2),将参数连接到字符串' '并添加空格{{1 }}

(您可以在strcat (string, argv[i]);之前添加strcat (string, " ");以消除尾随的空间

示例使用/输出

if (i > 1)