Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 修改字符串文字_C - Fatal编程技术网

C 修改字符串文字

C 修改字符串文字,c,C,为什么我运行这个程序时没有输出 #include<stdio.h> int main() { char* t="C++"; t[1]='p'; t[2]='p'; printf("%s",t); return 0; } #包括 int main() { char*t=“C++”; t[1]='p'; t[2]='p'; printf(“%s”,t); 返回0; } “C++”是存储在只读位置的字符串文本,因此无法修改。用这个- char*

为什么我运行这个程序时没有输出

#include<stdio.h>

int main()
{
    char* t="C++";
    t[1]='p';
    t[2]='p';
    printf("%s",t);
    return 0;
}
#包括
int main()
{
char*t=“C++”;
t[1]='p';
t[2]='p';
printf(“%s”,t);
返回0;
}
“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' ;

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

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

您的代码还有其他几个问题

  • 指针通常用于指向已经存在的数据,所以您可以像这样使用它

    char arr[]=“C++”

    char*t=&arr[0]

  • 也可以修改

    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.你的代码有很多地方不是c标准的

    #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
    }
    
    如果您不希望在字符串之后返回回车符。在windows中,请随意使用:

    printf(“%s”,t)

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

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

    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>
    
    这是错误的;正确的声明是:代码> int main(无效)<代码>(<代码> int main)(代码>在C中是有问题的,但是C++中是正确的)

    您的输出应该以换行符结束;如果不这样做,各种坏事都可能发生。这样做:

    printf("%s\n", t);
    
    (问题最初包括在结束前的这一行
    }

    getch();
    
    OP后来将其删除。这是Windows特有的。可能有必要在程序完成时阻止输出窗口关闭,这是Windows开发系统的一个不幸问题。如果您希望使用更标准的方法来执行此操作,
    getchar()
    只需从标准输入中读取一个字符,然后按Enter键即可完成(虽然它不会给你提示)。或者,如果你正在从IDE或命令提示符运行程序,大多数都不会立即关闭窗口。)

    最后,由于
    main
    返回类型为
    int
    的结果,它实际上应该这样做;您可以添加

    return 0;
    

    在结束之前,
    }
    。这不是必需的,但这不是一个坏主意。(C99添加了一个隐式的
    返回0;
    ,但Microsoft不支持C99。)(2019年更新:Microsoft对C99功能的支持稍好一些。我不确定
    返回0;
    是否必要。)
    main
    返回
    int
    ,而不是
    void
    。如果没有
    '\n'
    printf()
    输出可能不会在下一个语句执行之前显示(流
    stdout
    ,默认情况下,是行缓冲的)。请尝试
    printf(%s\n,t);
    printf(“%s”,t);fflush(stdout);
    @pmg:文本输出流是否需要关闭
    '\n'
    是由实现定义的。如果需要关闭,则行为是未定义的,即使使用
    fflush(stdout)
    。只需打印换行符就更容易、更可靠了。(在许多系统中,不需要换行符,但如果它缺少输出,则输出将与下一个shell提示符相邻,这很难看。)我敦促你接受基思的答案,这是一个更好的答案,我已经投了更高的票。我认为这根本不是问题。很明显。我回答了我认为被问到的问题。事实证明,情况并非如此。@Sadique:来自未来7年的问候!缺失的
    \n
    不是问题,但可能是一个I问题:“最后一行是否需要终止新行字符由实现定义。”--7.21.2p2。如果实现需要终止新行,而程序没有提供终止新行,则行为未定义。在Windows和POSIX/Unix/Linux下,它将只打印字符串而不打印新行(如果将shell提示符连接到输出上,这可能会在视觉上造成混乱。)
    char*t=“C++”;
    没有任何问题。字符串文本以静态分配的4个元素数组的形式提供“已经存在的数据”。(指针应该是
    const
    ,但它不是绝对必要的。)
    fflush
    是在
    中声明的,而不是在
    中声明的。在任何情况下,最好打印换行符;如果不想打印,那么无论如何都应该这样做。
    #include
    是完全可移植的,但是添加一个空格确实可以提高可读性。没有必要
    printf("%s\n", t);
    
    getch();
    
    return 0;