初学指针。。。。帮助看个弱爆了的问题
- C/C++ code
int _tmain(int argc, _TCHAR* argv[]){ char str[20]; char *pchar = str; printf("%s\n",str); for (int i=0;i<20;i++) { printf("%s%d%s\n","第" , i , "次:"); printf("%s\n",str); *(pchar + i) = 'r'; } printf("%s\n",str); getchar(); return 0;}数组str长度20,下面的循环20次,每次给数组的下一元素赋 字符“r”,为啥循环到第19次后面还有乱码???
这是控制台的输出结果:
.....
第10次:
rrrrrrrrrr烫烫烫烫烫烫烫aNx淮?
第11次:
rrrrrrrrrrr烫烫烫烫烫烫Nx淮?
第12次:
rrrrrrrrrrrr烫烫烫烫烫烫aNx淮?
第13次:
rrrrrrrrrrrrr烫烫烫烫烫Nx淮?
第14次:
rrrrrrrrrrrrrr烫烫烫烫烫aNx淮?
第15次:
rrrrrrrrrrrrrrr烫烫烫烫Nx淮?
第16次:
rrrrrrrrrrrrrrrr烫烫烫烫aNx淮?
第17次:
rrrrrrrrrrrrrrrrr烫烫烫Nx淮?
第18次:
rrrrrrrrrrrrrrrrrr烫烫烫aNx淮?
第19次:
rrrrrrrrrrrrrrrrrrr烫烫Nx淮?
rrrrrrrrrrrrrrrrrrrr烫烫aNx淮?
[解决办法]
跟指针没关系,纯粹对字符串概念不清楚
字符串必须以'\0'字符结尾
[解决办法]
for循环外面加个memset(str,0x00,20);初始化一下数组。
[解决办法]
如楼上所说,字符串没加尾
[解决办法]
出现这样的现象的原因是字符串的结尾没有'\0'结尾;每次赋值后在后面加上一个'\0'就可以了。还可以在for外面加上初始化:memset(str, 0, 20); 或者bzero(str, 20);
[解决办法]
- C/C++ code
int _tmain(int argc, _TCHAR* argv[]){ char str[21] = {0}; char *pchar = str; printf("%s\n",str); for (int i=0;i<20;i++) { printf("%s%d%s\n","第" , i , "次:"); printf("%s\n",str); *(pchar + i) = 'r'; } printf("%s\n",str); getchar(); return 0;}//给你一个正确的版本
[解决办法]
[解决办法]
代码功能够乱
[解决办法]
对电脑而言只有二进制字节及其对应的二进制地址,对人脑才有整数、小数、字母、字符串及其对应的指针。
[解决办法]
google c 风格字符串的定义
[解决办法]
int _tmain(int argc, _TCHAR* argv[])
{
char str[20]={0};
char *pchar = str;
printf("%s\n",str);
for (int i=0;i<20;i++)
{
printf("%s%d%s\n","第" , i , "次:");
printf("%s\n",str);
*(pchar + i) = 'r';
}
printf("%s\n",str);
getchar();
return 0;
}
[解决办法]
我不建议用内存初始化来代替字符串结尾赋0
虽然写起来简单,但一来可能降低效率,二来对楼主这种“长度20的字符串使用大小为20的字符数组”的错误想法是没用的
[解决办法]
转移字符'\0',字符串结束字符。
[解决办法]
楼主你写的赋值代码没有问题,指针使用也没问题。只是printf这个函数用的欠妥。首先楼主要知道printf参数的一般机理,其输出字符串是要求以\0结尾的。你在栈中分配了20个Char,这20个Char没有被初始化20个\0。打个简单的比方,char str[5];然后你对这str逐个赋值r。其内存中结构为
1 0x72 0xCC 0xCC 0xCC 0xCC 0xCC 0xCC 0x22 0x00
……
5 0x72 0x72 0x72 0x72 0x72 0xCC 0xCC 0x22 0x00
当你调用printf时,它回去寻找结尾符\0(0x00)。于是它每次输出都超出你想象的5个char的范围。
一般情况下,建议你多分配一个char,用于保存结尾符。即
char str[21] = {0};
……
然后只用20个。