【问题标题】:input strings in c and how to store the string into variable在c中输入字符串以及如何将字符串存储到变量中
【发布时间】:2014-12-14 23:53:49
【问题描述】:

这是一个非常基本的问题,但我无法通过谷歌找到任何相关信息。 因此,假设一个主函数传递了一些输入字符串。我正在尝试

main(argc, const char* argv[]) {
   char* test = argv[1]; // works but gives error if not at beginning of function

   char* test2;
   test2 = argv[2]; // error: invalid casting from const type

   char* test3;
   strcpy(test3, argv[3]); // run-time failure

   char test4[10];
   strcpy(test4, argv[4]); // works but what if the input string's length cannot be guaranteed
}

这太基础了……但我却一无所知。

【问题讨论】:

  • 始终说明您遇到的什么错误。此外,您的 main 声明并不完全完整。删除 const 后会发生什么?
  • 顺便说一句,run-time failure 的原因应该很明显:您正在将数据复制到“无处”(实际上是任何地方)。
  • @Martin James 输入只是任意字符串。
  • pseudocode 给您的编译和/或运行时错误如何“明显”?
  • 因为那些具有相同格式和不同变量名的行在我的程序中给了我错误............我应该提交我的350行程序只是为了几行有问题?我还必须展示我正在尝试的不同事物。我在问一个关于字符串概念的问题,而不是“查看我的代码”问题。我想问这个问题的更好方法是“为什么第一种和最后一种方式有效(但形式不好),而其他两种方式无效”。

标签: c string input c-strings


【解决方案1】:

在 c 中,字符串是指向某个内存块的指针,其中每个字节都包含一个字符。假设我有以下代码:

char * helloString = "hello"

一旦运行 所有,存储在 helloString 中的就是字符“h”在内存中的位置。内存中接下来的 5 个位置包含代表 'e'、'l'、l'、'o' 和 '\0' 的字节,最后一个是称为 NULL 的特殊字符,它告诉 c 字符串的结尾在哪里。

为了在运行时复制字符串,必须首先分配一些内存来放置字符,然后将它们复制到新内存中。 strcpy 在您的示例中失败的原因是没有为您的程序分配内存来将字符复制到其中。你需要做这样的事情:

int len = strlen(argv[1]);
char test[len]; //or char * test = malloc(len);
strcpy(argv[1], test);

但是请注意,如果 argv[1] 末尾没有 '\0',则此代码会非常 做坏事(如果幸运的话,会出现段错误)!

【讨论】:

  • 谢谢!我的编译器不允许我初始化动态大小的数组,我不得不使用 malloc。但这就是我解决问题的方法。谢谢!
  • @jnel899 如果您使用了 malloc,请确保在完成后释放()内存! Valgrind 是检查程序中没有泄漏任何内存的好工具。运行时长度数组在 c 标准中已有一段时间了。如果可能的话,我建议您将编译器升级到支持 c99 的编译器(例如最新的 gcc)。
【解决方案2】:

由于您提到它是伪代码,我无法帮助您修复代码。 您必须为测试变量分配内存或使用适合您输入的长度对其进行初始化。

【讨论】:

  • 好的...但是如何将输入字符串放入已声明的变量中? char* test = (char*) malloc (strlen(argv[1]));测试 = argv[1];给出相同的无效转换错误。抱歉,我不知道如何格式化此评论。
  • 你可以用你使用的任何一种方式来做,但是在分配内存之后,实际上会有放置字符串的位置......
  • 好的,我终于让它工作了。 char* test = (char*) malloc (strlen(argv[1])); strcpy(测试, argv[1]);工作正常。抱歉,我对 C 很不熟悉。感谢您的帮助。
猜你喜欢
  • 2022-11-02
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 2020-09-20
  • 1970-01-01
相关资源
最近更新 更多