逐个字符地打印字符串

时间:2014-02-07 16:16:15

标签: c

我知道,我的问题是编码的异常行为,但我只是这样做,深入理解C语言,所以我要求用户输入一个字符串,我想逐个字符地打印这个字符串,然后再这样做,我把字符串保存在内存中,它的地址保存在'x'中,我可以通过这种方式按字符打印这个字符串吗?

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

int main(int argc ,char *argv[20])
{
    char x ;
    strcpy(&x,argv[1]);
    printf("%s and it's length is %d : \n" , &x , strlen(&x));
    int i ;

    for(i=0 ; i < strlen(&x) ; i++)
    {
        printf(" hi : %c\n" , x[i]);
        /* also i try '%x[i]' but it's give me another error
        so how i do this ??*/
    }

    return 0;
}

4 个答案:

答案 0 :(得分:2)

基本思路是正确的,但代码中存在一些问题 x只是一个字符。你需要一个阵列 然后用&x替换每个x,因为数组指针本身已经是一个地址 另一件事:char *argv[20]
为什么20?为什么不char *argv[]

答案 1 :(得分:1)

deviantfan是正确的,你在内存中覆盖了不属于变量的东西。这是在没有任何内存编辑巫术的情况下完成任务的方法之一:

#define ARGV_SIZE 20

int main(int argc ,char *argv[ARGV_SIZE])
{
    char x[ARGV_SIZE];
    int argvLength;

    strcpy(x, argv[1]);
    argvLength = strlen(x);
    printf("%s and it's length is %d : \n" , x , argvLength);

    for (int i = 0 ; i < argvLength; i++)
    {
        printf(" hi : %c\n" , x[i]);
    }

    return 0;
}

或没有x变量你可以这样做:

int main(int argc ,char *argv[])
{
    int argvLength = strlen(argv[1]);

    printf("%s and it's length is %d : \n" , argv[1] , argvLength);

    for (int i = 0 ; i < argvLength; i++)
    {
        printf(" hi : %c\n" , argv[1][i]);
    }

    return 0;
}

答案 2 :(得分:1)

试试这个

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

int main(int argc ,char *argv[20]){
    char y = 'Y';
    char x ;
    char z = 'Z';
    strcpy(&x, "This program is correct!!!");
    printf("%s and it's length is %d : \n" , &x , strlen(&x));

    printf("%c%c%c", x,y,z);//print TYZ ?
    return 0;
}

答案 3 :(得分:1)

所以,从头开始:

int main(int argc ,char *argv[20])
                             ^^^^

这没有任何作用;无论何时将函数参数声明为T a[N]T a[],它都会被解释为T *a;写这个的传统方式是

int main( int argc, char *argv[] )

int main( int argc, char **argv )

第二种情况更准确地反映了真实情况; argv是指向char指针序列的指针。 argv[argc]的值为NULL

{
  char x ;
  strcpy(&x,argv[1]);

这是一个问题;通过将x声明为char,您只留出足够的存储空间来容纳单个字符值 1 ,但您尝试使用它来存储数组的字符值;那是行不通的,而且你最终会在x之后紧跟任何记忆,这可能会或可能不会导致崩溃。 C不对你进行任何界限检查;当您给strcpy一个地址时,它会很乐意将给定的字符串复制到该地址之后的存储中,而不会确保存储有效。

此时您有两种选择:您可以将x声明为char数组

  char x[SOME_SIZE]; // where SOME_SIZE is large enough to handle your
                     // largest expected input

并使用strcpy,如下所示:

  strcpy( x, argv[1] );

您只需将x声明为指向char的指针:

  char *x;

并指定它指向argv[1]的开头:

  x = argv[1];

无论哪种方式,代码的其余部分都变为

  printf("%s and it's length is %d : \n" , x , strlen(x));  // no & before x
  int i ;
  for(i=0 ; i < strlen(x) ; i++)
  {
      printf(" hi : %c\n" , x[i]);
  }
  return 0;
}

请注意,更简单的方法是

int main( int argc, char **argv )
{
  char *p = argv[1];
  if ( p )              // argv[1] is not NULL
  {
    while ( *p )        // argv[1][i] is not 0
      printf( "hi: %c\n", *p++ );
  }
  return 0;
}

<小时/> 1。这就是x[i]不适合你的原因,因为x不是数组或指针表达式