我知道,我的问题是编码的异常行为,但我只是这样做,深入理解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;
}
答案 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
不是数组或指针表达式