读书人

初学指针。帮助看个弱爆了的有关问题

发布时间: 2012-09-10 22:20:12 作者: rapoo

初学指针。。。。帮助看个弱爆了的问题

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;}//给你一个正确的版本
[解决办法]
探讨

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 , "次:"……

[解决办法]
代码功能够乱
[解决办法]
对电脑而言只有二进制字节及其对应的二进制地址,对人脑才有整数、小数、字母、字符串及其对应的指针。
[解决办法]
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个。

读书人网 >C语言

热点推荐