修改字符串文字

时间:2011-03-28 19:41:15

标签: c

为什么运行此程序时没有输出。

#include<stdio.h>

int main()
{
    char* t="C++";
    t[1]='p';
    t[2]='p';
    printf("%s",t);
    return 0;
}

4 个答案:

答案 0 :(得分:11)

“C ++”是存储在只读位置中的字符串文字,因此无法修改。有了这个 -

char* t="C++"; // t is pointing to a string literal stored in read only location

相反,你应该 -

char t[] = "C++" ;  // Copying the string literal to array t

实际上做 -

t[1] = 'p' ;

答案 1 :(得分:9)

C字符串文字创建一个char的匿名数组。任何修改该数组的尝试都有未定义的行为。理想情况下,这可以通过创建数组const来强制执行,但C并不总是const,并且将其添加到字符串文字会破坏现有代码。

char* t="C++";

这是合法的,但可能存在风险。包含字符'C', '+', '+', '\0'的数组可以存储在读写存储器中或只读存储器中,也可以存储在编译器中。

t[1]='p';

此处您的程序行为未定义,因为您正在尝试修改字符串文字的内容。编译器无需在编译时或运行时向您发出警告 - 也不需要做任何事情以使其“正常工作”。

如果您想让编译器知道该字符串是只读的,最好自己添加const限定符:

const char *t = "C++";

如果您尝试修改字符串文字,编译器应至少警告您 - 至少如果您尝试通过t这样做。

如果您希望能够修改它,您应该使t成为可写数组:

char t[] = "C++";

不是使t指向"C++"的开头,而是使t成为复制"C++"内容的数组。只要您不超出范围,就可以使用t的内容执行您喜欢的操作。

对您的代码提出更多评论:

#include<conio.h>

<conio.h>特定于Windows(和MS-DOS)。如果您不需要您的程序在任何其他系统上工作,那很好。如果您希望它是便携式的,请将其删除。

void main()

这是错的;正确的声明是int main(void)int main()在C中有问题,但在C ++中是正确的。)

printf("%s",t);

您的输出应以换行符结尾;如果不是,就会发生各种不好的事情。这个:

printf("%s\n", t);

而且:

getch();

是特定于Windows的。当程序完成时,可能需要保持输出窗口关闭,这是Windows开发系统的一个不幸的问题。如果你想要一个更标准的方法来做到这一点,getchar()只是从标准输入中读取一个字符,然后让你点击 Enter 来完成(虽然它没有给你一个提示)。

最后,由于main返回类型为int的结果,因此它应该实际执行此操作;你可以添加

return 0;

在结束}之前。这不是真的需要,但这不是一个坏主意。 (C99添加了隐式return 0;,但Microsoft不支持C99。)

答案 2 :(得分:8)

您的代码还有其他一些问题。

  1. 指针通常用于指向已存在的数据,因此您可以像这样使用

    char arr [] =“C ++”;

    char * t =&amp; arr [0];

  2. 也可以修改,

    t[1] = 'p';
    
    t[2] = 'p';
    

    当然有一种使用字符串的特殊方法 - 让指针指向一个字符串常量。就像你使用的那样:

    char *t = "C++";   // you cannot modify it in most operating systems
    t[1] = 'p';
    t[2] = 'p';
    

    有一种更好的使用方式,更便于携带,易于理解:

    const char* t="C++"; 
    

    2.您的代码有很多不符合标准的地方

    #include <stdio.h> // You'd better add a space between, for this is a good coding convention
    #include <conio.h> // only supported by vc/vs in windows, you can use getchar() instead
    
    int main()  // main returns int
    {
        char* t = "C++";
    
        t[1] = 'p';
        t[2] = 'p';
        printf("%s\n", t);  // it's a good habit to add a '\n' when printing a string
        getchar();   // getchar() is supported by c standard library 
    
        return 0; // return 0 here
    }
    

    3.关于打印字符串

    Linux是行缓冲的(如果你使用的是Windows,请忽略这个:P)&amp;为了便于在控制台中阅读,最好在打印字符串末尾添加'\ n':

    printf("%s\n",t);
    

    如果您不希望在字符串后返回回车符。在Windows中使用就像你喜欢的那样:

    printf("%s",t);

    在Linux中,你应该在stdlib.h中添加一个fflush()。

    printf("%s",t);
    fflush(stdout);
    

答案 3 :(得分:0)

某些版本的标准运行时库需要\n才能显示输出。

printf("%s\n",t);