【发布时间】: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);将在没有不需要的缓冲区的情况下执行此操作,从而无需str和p。理想情况下,您使用char*并放弃重复的strlen呼叫。