在双指针数组中将字符串更改为upper

时间:2015-02-18 06:20:39

标签: c arrays pointers toupper

我需要转换命令行给出的参数,例如:$ myprogram hello world

并且需要在CAPS中打印单词。除了访问双指针数组以使用toupper()

进行更改之外,我能够执行所有操作
static char **duplicateArgs(int argc, char **argv)
{
    char **copy = malloc(argc * sizeof (*argv));
    if(copy == NULL){
        perror("malloc returned NULL");
        exit(1);
    }

    int i;
    for(i = 0; i<argc; i++){
         copy[i] = argv[i];   
    }
    char **temp;
    temp = &copy[1];
    *temp = toupper(copy[1]); 

    return copy;
}

5 个答案:

答案 0 :(得分:3)

*temp = toupper(copy[1]);
如果要转换整个字符串,

toupper会转换单个字符:

char *temp = copy[1]; /* You don't need a double pointer */
size_t len = strlen(temp);

for (size_t i = 0; i < len; i++) {
    temp[i] = toupper(temp[i]); 
}

答案 1 :(得分:1)

来自toupper()的{​​{1}}函数原型是

  

int toupper(int c);

在您的代码中,参数copy[1]不是int值。

而你想要的是检查每个元素,如果它们是小写的,则将它们转换为大写。伪代码看起来像

for(i = 0; i<argc; i++){
         copy[i] = malloc(strlen(argv[i])+ 1);  //allocate memory 

for (j = 1; j < argc; j++)
  for (i = 0; i < strlen(argv[j]); i++)
  {
    if (islower(argv[j][i]))   //check if it is lower case
         copy[j-1][i] = toupper(argv[j][i]);
    else
         copy[j-1][i] = argv[j][i];          //do not convert
  }

答案 2 :(得分:1)

我假设传递给函数char **argv的参数直接从main传递,因此它表示指向每个命令行参数的指针数组开头的指针。

argc表示命令行参数的数量。

在函数内部,创建一个新缓冲区,然后将argv的内容复制到其中。因此,您要创建指向命令行参数的指针数组的副本,而不是命令行参数字符串本身。

我猜你打算复制字符串,而不是指向字符串的指针(那是什么意思?)。我建议你查看函数strdup和/或strncpy来复制实际的字符串。

这也解释了&#39; toupper&#39;不能按预期工作 - 而不是将单个字符传递给它,而是传递指向空终止字符串的指针。

答案 3 :(得分:0)

您使用toupper()函数遇到错误,因为您尝试传入字符串而不是单个字母。以下是描述函数的手册页的摘录:

DESCRIPTION
     The toupper() function converts a lower-case letter to the corresponding
     upper-case letter.  The argument must be representable as an unsigned
     char or the value of EOF.

你有一个指向指针的指针,你可以像这样看到它。在C中,字符串只是char的数组,因此您需要取消引用两次以获取第二级数组(单个字母)中的数据。每次添加*时,您都可以将其视为删除一层指针。您可以将*运算符视为&运算符的反转。

此行是您的问题专栏

temp = &copy[1];

试试这个

//This is a pointer to an individual string
char *temp = copy[1];
//Keep going while there are letters in the string
while(*temp != NULL) {
    //convert the letter
    toupper(*temp);
    //Advance the pointer a letter
    temp++;
}

答案 4 :(得分:0)

考虑这个例子:

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

static char **duplicateArgs(int argc, char **argv)
{
    char **copy = NULL;
    // allocate memry for pointers to new lines
    copy = (char **)malloc(sizeof(char *) * argc);
    int line, chr;
    for(line = 0; line < argc; line++)
    {
        // allocate memory for new line
        copy[line] = (char *)malloc(sizeof(char) * (strlen(argv[line]) + 1));
        // copy with changes
        for(chr = 0; chr <= strlen(argv[line]); chr++)
        {
            copy[line][chr] = toupper(argv[line][chr]);
        }
    }
    return copy;
}

int main(int argc, char * argv[])
{
    char ** strs;
    int i;
    strs = duplicateArgs(argc, argv);
    for(i = 0; i < argc; i++)
    {
        printf("%s\n", strs[i]);
    }
    return 0;
}

修改

您也可以决定使用argv [0](可执行文件的名称)并根据需要更改代码。还可以添加malloc结果的检查,以及其他改进......如果您需要: - )