2011-05-07 180 views
0
main() 
{ 
    char *x="girl"; 
    int n,i; 
    n=strlen(x); 
    *x=x[n]; 
    for(i=0;i<n;i++) 
    { 
    printf("%s \n",x); 
    x++; 
    } 
} 

什么是输出?
请解释输出.......................
O/P是:C,指针,字符串

irl 
rl 
l 
+2

结果= UB =未定义行为(u)r – 2011-05-07 14:03:22

+0

将'char * x'更改为'char x []'以避免未定义的行为。 – hugomg 2011-05-07 14:04:33

+0

@missingno:代码中存在更多的UB问题;修改字符串文字并不是孤立的 – pmg 2011-05-07 14:10:01

回答

1

正如其他人指出的那样,编写的程序具有未定义的行为。

如果你做一个小的改动:

char x[] = "girl"; 

那么我相信它是合法的,并可能解释。 (编辑:其实还是有它的问题这是int main(),你应该return 0;在年底也因为你使用strlen需要#include <string.h>,并#include <stdio.h>因为您正在使用printf。)

线

​​

x[0](即*x)至x[4](这恰好是一个字符串结束'\0')。因此,要打印的第一个字符串是空字符串,因为第一个字符是字符串终止符。

然后我们通过串循环,一次一个字符,打印字符串:

irl 
rl 
l 
+0

非常感谢... – Adi 2011-05-07 14:18:59

4

的输出是不确定的行为。你修改了一个字符串文字。

+0

:).....好的char * x =“hello”; – Adi 2011-05-07 14:05:03

+0

...并且在范围内没有原型调用可变参数函数;并没有从'main'返回一个值(因为C99禁止隐式的'int',所以代码不是C99(它会接受一个没有返回的main)。 – pmg 2011-05-07 14:07:06

+1

@Adi:你只改变了字符串中的单词。这不会改变UB。 – 2011-05-07 14:18:48

1

虽然结果是不确定的行为,如DeadMG说,让我们假设你声明x作为char x[] = "girl"

分配4 n(因为单词“女孩”的长度4),你在x[4]分配值*x(这是x[0]),但这个值是“\ 0”(空终结符)

现在,您循环并打印x到下一个空终止符的单词,但第一次,第一个字符是空终止符,因此您什么都得不到。之后,您将从递增索引打印单词。

g i r l \0 

*x = x[4]: 

\0 i r l \0 
^ ^^^
it1 it2 it3 it4  // << Where does x points to in each iteration of the for loop 
0

该代码是令人怀疑的怀疑。 *x=x[n]试图覆盖文字“女孩”,并且效果会因平台和编译器而异。更准确地说,它应该被声明为:

const char *x = "girl"; 

然后它不会(不应该)编译。

+0

更准确地说,他应该让它安全地修改字符串,而不是通过使字符串编译器的原始非可变性被检查来强制他的整个程序中断。 – 2011-05-07 14:20:24

+0

咦?如何编写无法编译的代码更为正确? – 2011-05-07 14:21:03

+0

@Simon:它是“更正确的”,它不会允许他修改字符串; IOW,编译器会为他捕捉这些错误。 – 2011-05-07 15:48:28