程序的总体要点是接受一个命令行参数,并为每个字符串向后打印可变长度。
例如:
$ ./reversecommand hello 102
dnammocesrever/. olleh 201
我很难将思维过程实现到代码中(例如,下面有hello)。有什么想法吗?
argc[0] ./reversecommand
argc[1] hello
argc[1][0] h -> argc[1][4] o
argc[1][1] e -> argc[1][3] l
argc[1][2] l -> argc[1][2] l
argc[1][3] l -> argc[1][1] e
argc[1][4] o -> argc[1][0] h
argc[2] 102
argc[3] [null]
答案 0 :(得分:1)
#include <stdio.h>
#include <string.h>
static void print_reversed(const char *str, size_t len)
{
const char *ptr = str + len;
while (ptr > str)
putchar(*--ptr);
}
int main(int argc, char **argv)
{
for (int i = 0; i < argc; i++)
{
if (i != 0)
putchar(' ');
print_reversed(argv[i], strlen(argv[i]));
}
putchar('\n');
return 0;
}
无需修改字符串;只需按相反的顺序逐个打印出一个字符。
答案 1 :(得分:0)
逻辑相当简单:对于argv中的每个字符串,将其反转然后打印。
#include <stdio.h>
#include <string.h>
void swap_characters(char *s, char *t) {
char tmp = *s;
*s = *t;
*t = tmp;
}
void reverse_string(char *s, int length) {
for (int i = 0; i < length / 2; ++i)
swap_characters(s + i, s + length - 1 - i);
}
int main(int argc, char **argv) {
for (int i = 0; i < argc; ++i) {
reverse_string(argv[i], strlen(argv[i]));
printf("%s ", argv[i]);
}
printf("\n");
}
答案 2 :(得分:0)
有许多方法可以进行字符串反转,值得花一些时间研究,因为这是一个标准的面试问题。
C
中以null结尾的字符串的简单实现看起来像
char * reverse(char * string){
int i;
int len = strlen(string);
for (i = 0; i < len/2; i++){
char c = string[i];
string[i] = string[len - i - 1];
string[len - i - 1] = c;
}
return string;
}
此版本操作字符串,因此我们将制作字符串的副本以防万一。
一旦你有字符串反转,你需要在每个参数上运行reverse
并打印出来。
注意:像这样的标准控制台应用程序中的参数以用户键入的程序名称开头。因此,如果程序被调用为./my-program arg1 arg2
,argv[0]
将为"./my-program"
,那么我们将跳过argv[0]
使用它,你所要做的就是在每个参数上调用reverse。像这样
int main(int argc, char ** argv){
int i;
char * copy;
for ( i = 1; i < argc; i++){ // skip argv[0]
copy = strdup(argv[i]); // copy the string;
copy = reverse(copy);
printf("argv[%d] = \"%s\"\n", i, copy);
free(copy); // clean up the copy
}
}
总之,你得到
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * reverse(char * string){
int i;
int len = strlen(string);
for (i = 0; i < len/2; i++){
char c = string[i];
string[i] = string[len - i - 1];
string[len - i - 1] = c;
}
return string;
}
int main(int argc, char ** argv){
int i;
char * copy;
for ( i = 1; i < argc; i++){ // skip argv[0]
copy = strdup(argv[i]); // copy the string;
copy = reverse(copy);
printf("argv[%d] = \"%s\"\n", i, copy);
free(copy); // clean up the copy
}
}
答案 3 :(得分:0)