user-0 提问: 一道字符串指针选择题..哪位大神来帮小弟解答一下

回复:
user: user-0
content: 不知为什么开不了帖子..老是说文章内容不能含有特殊字符..无奈只能放在这里了。！！

user: user-0
content: 如下题,答案我都知道,希望有详细易懂的解释 1．以下正确的程序段是（）。 A． char s;                               B． char *s; scanf("%s", &s);                             scanf("%s", s); C． char s;                               D． char s, *t=s; scanf("%s", &s);                           scanf("%s", t); 2．下面程序段的运行结果是（）。 #include "stdio.h" main() {     int m=10, n=20;     char *format="%s, m=%d, n=%d\n";     m*=n;     printf(format, "m*=n", m,n); } A． format, "m*=n", m, n                      B． format, "m*=n" C． m*=n, m=200, n=20                        D． 以上结果都不对 3．下面程序的功能是将八进制正整数字符串转换为十进制整数。请选择填空。 #include "stdio.h" #include "string.h"     main()     {         char *t, s;         int n;         t=s;         gets(t);         n=【1】;         while (【2】!= '\0') n=n*8+*t-'0';         printf("%d\n", n);     }     【1】A． 0           B． *t              C． *t-'0'             D． *t+'0'     【2】A． *t          B． *t++            C． *(++t)              D． t 4．以下正确的程序段是（）。 A． char s="12345", t="6543d21";    strcpy( s,t); B． char s, *t="12345";   strcat(s,t); C． char s=" ", *t="12345"; strcat(s, t); D． char *s="12345", *t="54321";  strcat (s,t); 5．不合法的main函数命令行参数表示形式是：（）。     A． main( int a, char *c)                  B． main(int argc, char *argv)     C． main( int arc, char **arv)               D． main( int argv, char*argc) 6．下面程序的功能是统计字串sub在母串s中出现的次数。请选择填空。 #include "stdio.h" #include "string.h"     main()b     {         char s, sub;//字符串函数         int n;         gets(s);         gets(sub);         printf("%d\n", count(s,sub));     }     int count( char *p, char *q)     {         int m, n, k, num=0;         for (m=0; p; m++)             for (【1】, k=0; q==p; k++, n++)  //b  c                 if(q=='\0')                 { num++;  break;}         return (num);     }     【1】A． n=m+1        B． n=m            C． n=0              D． n=1     【2】A． k             B． k++            C． k+1              D． ++k #include "stdio.h" #include "string.h"     main(int argc, char *argv)     {            int m, length=0;         for (m=1;m<argc; m++)  length+=strlen(argv);         printf("%d\n", length);     }   7.  程序编译连接后生成的可执行文件是file.out，若执行时输入带参数的命令行是：     ./file.out 1234  567  89↙     则运行结果是（）     A． 22              B． 17               C． 12             D． 9 8.假定下列程序的可执行文件名为file.out，则在该程序所在的子目录下输入命令行：     ./file.out  girl  boy↙     后，程序的输出结果是（）。 #include "stdio.h"     main(int argc, char *argv)     {            int m;         if (argc<=0) return;         for (m=1; m<argc ; m++)             printf("%c", *argv);     }     A． girl  boy        B． gb             C． gir              D． girlboy 9．设有一个名为file的C源程序，且已知命令行为：file  girl  boy  student， 则可得到以下运行结果的C源程序为（）     girl     boy     student     A． main( int argc, char *argv)     {           while (--argc>1)             printf("%s%c", *argv, (argc>1)? '\n'：' ');     }     B． main( int a, char * b)     {          while (a-->1)             printf("%s\n", *++b);     }     C． main( int argc, char *argv)     {           while (++argc>0)             printf("%s%c", *++argv, (argc>1) ? ' ' ：'\n');     }     D． main(int argc, char *argv)     {          while (argc>1)             printf("%s", *++argv);      }

user: user-1
content: 引用 9楼我是你的主体 的回复:[quote=引用 4 楼 weixin_30460121 的回复:] char *s=“girl” //将字符串首地址赋值给       指针变量s(指针即地址) char *s; s=“girl” //同上  char *s; s="girl";这个不是s是指针变量只能存储地址吗..怎么能存储girl这个字符串[/quote]s="girl"并不是说将字符串常量“girl”赋值给s，而是将字符串常量的首地址赋值给s，s=“girl”=>s=&'g'

user: user-2
content: 引用 8 楼 ddyyuan 的回复:[quote=引用 3 楼 Jammg 的回复:] char *s="string"； 被编译时，这个字符串常量是储存在字符串常量区的，他在整个程序的声明周期有效，编译时编译器会将字符串常量所在的地址返回给s,也就是说s指向字符串常量区的某个地方。 这是C语言中一个语法标准，记住就好了  后面的 char *s; s="girl";这个不是s是指针变量只能存储地址吗..怎么能存储girl这个字符串 [/quote] 这个字符串是存储在字符串常量区的，它的首地址才是储存在s，C语言规定这种语法就要这样被编译.

user: user-3
content: s存储的就是“gril”的首地址

user: user-0
content: 引用 4 楼 weixin_30460121 的回复:char *s=“girl” //将字符串首地址赋值给       指针变量s(指针即地址) char *s; s=“girl” //同上  char *s; s="girl";这个不是s是指针变量只能存储地址吗..怎么能存储girl这个字符串

user: user-0
content: 引用 3 楼 Jammg 的回复:char *s="string"； 被编译时，这个字符串常量是储存在字符串常量区的，他在整个程序的声明周期有效，编译时编译器会将字符串常量所在的地址返回给s,也就是说s指向字符串常量区的某个地方。 这是C语言中一个语法标准，记住就好了  后面的 char *s; s="girl";这个不是s是指针变量只能存储地址吗..怎么能存储girl这个字符串

user: user-1
content: B. 字符数组只能在初始化时赋初值.char s[10];s[10]="girl" (错)

user: user-1
content: A. char *s=“girl”;*s=“girl” （错）//s为字符串首地址，*s为首地址指向的字符，*s，=‘g’

user: user-4
content: 引用 3 楼 Jammg 的回复:char *s="string"； 被编译时，这个字符串常量是储存在字符串常量区的，他在整个程序的声明周期有效，编译时编译器会将字符串常量所在的地址返回给s,也就是说s指向字符串常量区的某个地方。 这是C语言中一个语法标准，记住就好了  非常简单明了的解释，多谢

user: user-1
content: char *s=“girl” //将字符串首地址赋值给       指针变量s(指针即地址) char *s; s=“girl” //同上

user: user-2
content: char *s="string"； 被编译时，这个字符串常量是储存在字符串常量区的，他在整个程序的声明周期有效，编译时编译器会将字符串常量所在的地址返回给s,也就是说s指向字符串常量区的某个地方。 这是C语言中一个语法标准，记住就好了

user: user-0
content: 我也知道C对..然而..清楚详细的解释总是找不到唉

user: user-4
content: A错，左边是地址，右边是字符串，不能进行赋值;  B错，左边是类型为char的数组s，字符宽度为10。 右边是将数组初始化为字符串"girl" 。相当于先声明数组，再给数组赋值。左边这部分是对的。但是在等价于后面， s[10]相当于字符串s的第11个元素，一个是没有第11个元素，另外一个是右边是字符串，肯定不对。  C对。编译通过……为啥，不知道。我没学到这个char *s=字符串的  D错。左边是没问题的。右边的问题在于，编译器会认为 t[4] 是数组t的第5个元素。一方面没声明数组t，另一方面就算声明了，也会让编译器以为你要把字符串赋值为数组t 的第五个元素