【问题标题】:Warning in String Inverter Program in CC 中字符串逆变器程序中的警告
【发布时间】:2025-12-31 08:55:06
【问题描述】:

我是一个非常缺乏经验的 C 学习者,我在这段代码中收到了一个警告,它应该在调用时反转作为命令的第一个参数传递的字符串(在 Linux Ubuntu 中编程)。

警告是:14:9: 警告:赋值从没有强制转换的指针生成整数

    #include <stdio.h>
    #include <string.h>

    int main(int argc, char *argv[]) {

        char str[80];
        int p = 0;
        int i;

        for(i = strlen(argv[1]) - 1; i >= 0; i--){
            str[p] = argv [1][i];
            p++;
        }

        str[p] = "\0";
        printf("%s\n", str);

    }

当我在此处使用命令 ./command stringhere 时,假定代码(并且它包含一些不需要的字符)打印第一个参数的反转字符串。

例如,当我使用 ./invert_string 字符串时,控制台会打印 gnirts 和一堆问号和其他字符。是否有一个原因?代码是否在它不应该打印的内存中打印值?

【问题讨论】:

  • 开启编译器警告! str[p] = "\0"; 行具有不兼容的类型:左侧是 char,右侧是 pointer to char(通过从 char 数组自动转换)。无论如何,任何编译器都不应该接受。
  • 您也不需要进行反向复制来执行此操作。循环中的fputc(argv[1][i], stdout); 将在没有不需要的缓冲区的情况下执行此操作,从而无需strp。理想情况下,您使用 char* 并放弃重复的 strlen 呼叫。

标签: c linux string warnings


【解决方案1】:

您看到的问题的直接解决方法是将 nul 终止语句更改为:

str[p] = '\0';

此更改是必需的,因为您要分配一个 char ('\0') 而不是 char * ("\0")。

但是,由于源字符串是 nul 终止的,您可以将终止符与整个字符串一起复制。

此外,请注意,如果源字符串长度超过 80 个字符,则会出现缓冲区溢出。

【讨论】: