再谈字符串的定义,你有没有这样试过?
对于用 char *p="China" 这样定义的字符串。教材中说,把字符串常量的首地址赋给p(教材中使用的编译器为Turbo C 2.0).而且我们大多数人认为这样定义后,字符串常量“China"的什不能修改。
那么请大家看下面的程序。
main()
{char *str;
str="thank you";
printf("the address of cosnt \"thank you \" is %p\n",str); /* 输出 字符串常量thank you的地址 */
printf("Enter your string:\n");
scanf("%s",str);
printf(" the address of const %s is %p",str,str);
getch();
}
{char *str;
str="thank you";
printf("the address of cosnt \"thank you \" is %p\n",str); /* 输出 字符串常量thank you的地址 */
printf("Enter your string:\n");
scanf("%s",str);
printf(" the address of const %s is %p",str,str);
getch();
}
程序运行结果为:the address of cosnt "thank you is 0840:0094
the address of cosnt " 输入的内容 " is 10840:0094
这不就是说明原来的字符常量thank you被输入的内容覆盖了吗?,因而实现的字符常量的修改。
如果要考察"thank you "是否还在内存中,可以在程序的开始用另一个指针变量p也指向"thank you",在程序的最后输出
p指向的内容,如果p指向的内容仍为"thank you "说明字符串常量"thank you "没有被修改;若p指向的内容为在程序运行时输入的内容说明字符常量"thank you "被修改
main()
{char *str,*p;
p= str="thank you";
printf("the address of cosnt \"thank you \" is %p\n\n\n\n",str); /* 输出 字符串常量thank you的地址 */
printf("Enter your string:\n");
scanf("%s",str);
printf("\n\n\nthe address of const %s is %p\n\n\n",str,str);
printf("*p=%s",p);
getch();
}
{char *str,*p;
p= str="thank you";
printf("the address of cosnt \"thank you \" is %p\n\n\n\n",str); /* 输出 字符串常量thank you的地址 */
printf("Enter your string:\n");
scanf("%s",str);
printf("\n\n\nthe address of const %s is %p\n\n\n",str,str);
printf("*p=%s",p);
getch();
}
本人使用的编译器为MyTC v5.2
[此贴子已经被作者于2006-5-6 14:40:17编辑过]
----------------解决方案--------------------------------------------------------
#include <stdio.h>
void main()
{char *str;
str="thank you";
printf("the address of cosnt \"thank you \" is %p\n",str); /* 输出 字符串常量thank you的地址 */
printf("Enter your string:\n");
scanf("%s",str);
printf(" the address of const %s is %p",str,str);//不是%d而是%p吧??
}
----------------解决方案--------------------------------------------------------
scanf("%s",str);
printf(" the address of const %s" is %d",str,str);
你赶快去好好学学电脑应用吧,你如果输入10000个字符,估计你的系统就报废了,this is terrible
----------------解决方案--------------------------------------------------------
%d也能打印地址
----------------解决方案--------------------------------------------------------
哦。
----------------解决方案--------------------------------------------------------
不好意思,刚才程序上出了点问题
----------------解决方案--------------------------------------------------------
非常感谢大家提出宝贵的意见!!!!!!!!!!!!!
----------------解决方案--------------------------------------------------------
以下是引用论坛在2006-5-5 21:56:00的发言:
scanf("%s",str);
printf(" the address of const %s" is %d",str,str);
你赶快去好好学学电脑应用吧,你如果输入10000个字符,估计你的系统就报废了,this is terrible
scanf("%s",str);
printf(" the address of const %s" is %d",str,str);
你赶快去好好学学电脑应用吧,你如果输入10000个字符,估计你的系统就报废了,this is terrible
能解释一下吗?
----------------解决方案--------------------------------------------------------
[QUOTE]对于用 char *p="China" 这样定义的字符串。教材中说,把字符串常量的首地址赋给p.而且我们大多数人认为这样定义后,字符串常量“China"的什不能修改。[/QUOTE]
确是如此,如果你用32位的编译器如VC,C-freet等等,“China"是不能被修改的.
但,TC是可以修改“China"的.
TC是DOS时代的东西。DOS始终认为系统只运行一个程序,而这个程序可以使用所有系统资源,包括内存。 Windows是一个多任务的系统,可同时运行多个程序。所以操作系统在内存管理更为严格。 |
----------------解决方案--------------------------------------------------------
的确不能改,因为那已经是静态内存里面的东西了.如你想修改的话,用字符串数组就可以修改.或者用指向指针的指针也可以修改,只是比较难理解.
----------------解决方案--------------------------------------------------------