【问题标题】:C Program to print string from commandline in reverse [duplicate]C程序从命令行反向打印字符串[重复]
【发布时间】:2021-05-19 03:12:31
【问题描述】:
/* Pgm to print string from commandline and reverse it */
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>

int main(int argc, char *argv[]) {
  if(argc<1){
    perror("Not enough arguments");
  }
  // Printing the string
  for(int i=1; i<argc ; i++){
   printf("%s\n",argv[i]);
  }
  //Part to print the string in reverse
  char *arr = (char*) malloc(sizeof(argv[1])+1);    // +1 for the NULL terminator
  strcpy(arr,argv[1]);
  char *str = (char*) malloc(sizeof(argv[1])+1);       //buffer array

//Reverse part begins
int j=0;
  for(int i= sizeof(argv[1]); i>=0 ; i--){
    str[j] = arr[i];
    j++;
  }

  for(int j=0;j<sizeof(argv[1]);j++){        // Printing the reverse string
  printf("R=%s\n",&str[j]);
 }

  free(arr);
  free(str);
  return 0;
}

这个程序应该在命令行上以相反的顺序打印来自 argv[1] 的文本。但是我得到的输出很奇怪。 输出

user@DESKTOP-KI53T6C:/mnt/c/Users/user/Documents/C programs$ gcc linex.c -o linex -Wall -pedantic -std=c99
user@DESKTOP-KI53T6C:/mnt/c/Users/user/Documents/C programs$ ./linex hello
hello
R=
R=
R=
R=
R=olleh
R=lleh
R=leh
R=eh

此外,当输入超过一定数量的字符时,它会自动截断它:

user@DESKTOP-KI53T6C:/mnt/c/Users/user/Documents/C programs$ ./linex strcmpppssdsdssdsd
strcmpppssdsdssdsd
R=spppmcrts
R=pppmcrts
R=ppmcrts
R=pmcrts
R=mcrts
R=crts
R=rts
R=ts

我想要的只是当我输入 'hello' 时的输出是:'olleh'

【问题讨论】:

  • sizeof 不会给你字符串的长度。为此使用strlen()
  • 这里有很多误解。我建议找一本好的 C 基础知识书,逐章理解所有内容。
  • 另外,也不是没有成千上万个如何反转字符串的代码示例

标签: c command-line-arguments reverse c-strings function-definition


【解决方案1】:

表达式argv[1] 的类型为char *。那就是它是一个指针。 sizeof( char * ) 相当于表达式 sizeof( argv[1] ) 等于 48,具体取决于所使用的系统。

例如在这一行

char *arr = (char*) malloc(sizeof(argv[1])+1);

分配的内存不足,无法存储指针argv[1] 指向的字符串。您需要使用表达式 strlen( argv[1] ) 而不是表达式 sizeof( argv[1] )

此外,如果要以相反的顺序输出字符串,则无需动态分配字符数组。这只是个坏主意。

这是一个演示程序,展示了如何以相反的顺序输出字符串。

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

int main(void) 
{
    const char *s = "Hello";
    
    for ( size_t i = strlen( s ); i != 0; )
    {
        putchar( s[--i] );
    }
    
    putchar( '\n' );
    
    return 0;
}

程序输出是

olleH

如果您不仅想以相反的顺序输出字符串,还想以相反的顺序创建一个新字符串,那么您需要编写一个函数,将存储在一个字符数组中的字符串复制到另一个字符数组中.

这是一个演示程序。

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

char * copy_reverse( char *s1, const char *s2 )
{
    size_t n = strlen( s2 );
    
    s1[n] = '\0';
    
    while ( *s2 ) s1[--n] = *s2++;
    
    return s1;
}

int main(void) 
{
    const char *s1 = "Hello";
    
    char *s2 = malloc( strlen( s1 ) + 1 );
    
    if ( s2 ) puts( copy_reverse( s2, s1 ) );
    
    free( s2 );

    return 0;
}

程序输出同上图

olleH

【讨论】:

  • 谢谢!将其从 sizeof 更改为 strlen 解决了该问题。现在它正在以相反的顺序从命令行打印文本。
  • @technextgen 完全没有。不客气。:)
猜你喜欢
  • 2013-12-07
  • 2010-12-23
  • 2018-09-08
  • 2022-06-18
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 2014-02-17
  • 2019-12-09
相关资源
最近更新 更多