1

为什么我的代码不接受 argv[] 字符串?我需要做什么来修复它?我希望能够同时输入小写和大写字母,并在数组中只输入小写字母。谢谢你的帮助。

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

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

  char word[30]= atoi(argv[1]);  // here is the input
  for (int i = 0; word[i]; i++)
    word[i] = tolower(word[i]);

  printf("Here is the new word: %s\n", word);
  return 0;
}
4

2 回答 2

3

您的代码有几个问题:

  • 正如KingsIndian已经提到的,您在 main 函数的 argv 参数前面缺少一个 * 。这个“主要功能”维基页面包含更多关于此的详细信息。

  • atoi用于将字符串数字转换为整数。我想这不是你想要的。argv[x]已经是一个字符串(char *),所以可以直接使用。

  • 如果你直接使用它,你不能修改它的内容(我相信是不允许的)。因此,您需要制作副本。用于strlen()找出 的长度argv[1]malloc()创建缓冲区并strcpy()复制它:


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

int main(int argc, char *argv[])
{
  char *word = malloc(strlen(argv[1]) + 1);
  strcpy(word, argv[1]);
  int i;
  for (i = 0; word[i]; i++)
    word[i] = tolower(word[i]);

  printf("Here is the new word: %s\n", word);
  return 0;
}

补充说明:

  • 如果您使用argc!检查给定命令行参数的数量会更好(更健壮)

  • 理论上malloc()可以返回0,说明认领内存确实失败了。所以你应该检查一下。

  • 如果您只想打印小写世界,则不需要先转换然后打印。相反,您可以直接打印每个转换后的字符。

于 2012-11-11T02:37:11.590 回答
3
int main(int argc, char argv[])

应该:

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

此外,strtol是一个更好的选择,比atoiasstrtol可以更好地处理故障。

于 2012-11-11T02:22:09.813 回答