我被困在我正在处理的一段代码上。我需要使用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
狐狸跳过日志
示例所需输出:
记录跳过的狐狸
当前输出:
答案 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
开始,然后只要参数索引大于0
(i
)并且您在允许的字符数{{}范围内1}}(len + strlen (argv[i]) + 2 < MAXC
允许 nul-terminator 和+2
),将参数连接到字符串' '
并添加空格{{1 }}
(您可以在strcat (string, argv[i]);
之前添加strcat (string, " ");
以消除尾随的空间。
示例使用/输出
if (i > 1)