【问题标题】:Can't rename the string that contains a command line argument无法重命名包含命令行参数的字符串
【发布时间】:2020-09-10 00:30:40
【问题描述】:

我对 C 非常陌生(使用 C 已经 2 天了),过去 30 个小时我一直在学习教程点和一些随机的 youtube 视频,但对于我的一生,我不知道如何在我在命令行中给出的字符串上加上一个名字。

所以我有一个文件filename.c 然后三个参数是

./filename.c F22 G2

我知道argv 中的第二个参数,即argv[1] 包含字符串F22,而argv[2] 包含G2。我不想将这两个字符串重命名为str1str2

当我这样做并尝试打印 str1 时,我得到了很多奇怪的字符,而不是 F22。我在搞砸什么?请参阅下面的代码。

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

int main (int argc, char* argv[])
{
   char* str1[] = {argv[1]};
   char* str2[] = {argv[2]};

   printf("%s\n", str1);
   return 0;
}

感谢任何帮助。

【问题讨论】:

  • 试试 const char *str1 = argv[1];const char *str2 = argv[2]; 但首先,最好始终检查 argc 以确保它们存在。
  • char* str[1] 有点像二维字符数组,看来你需要一维(字符串),所以使用char* str = argv[i]
  • 如果构建时带有详细警告,那么编译器应该会抱怨 printf 调用,其中参数类型与格式说明符不匹配。
  • 我把const放在那里是因为最好不要尝试覆盖传递的字符串。
  • @anastaciu 确保您也可以承担缓冲区溢出的风险。最好不要这样做。

标签: c command-line-arguments


【解决方案1】:

定义

char* str1[] = {argv[1]};

str1 定义为一个包含单个char * 元素的数组,而该单个元素为argv[1]

重要的是str1 不是字符串,它是字符串的数组

要定义一个字符串,你需要去掉大括号(方括号和花括号):

char* str1 = argv[1];  // Define str1 as an alias for argv[1]

当然,你也可以直接使用argv[1]

printf("%s\n", argv[1]);

并且对于你不应该修改的字符串,建议const限定它:

const char* str1 = argv[1];  // Define str1 as an alias for argv[1]

【讨论】:

  • 精彩的解释,谢谢!是的,我知道在 print 语句中直接使用 argv[1] 的可能性,但这只是更大问题的一小部分,所以我将首先修改这两个字符串(将字符串的数字部分并转换为 int。)我将在 2 分钟内将其标记为已接受。
猜你喜欢
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 2011-03-16
  • 2021-03-20
  • 2014-09-18
  • 1970-01-01
  • 2021-09-07
  • 2018-12-04
相关资源
最近更新 更多