【问题标题】:Copying string into char array将字符串复制到 char 数组中
【发布时间】:2014-07-09 00:13:28
【问题描述】:

我有一个 char* 类型的标记,我想获取它的第二个元素。例如,令牌都包含 4 个长课程编号,例如 1405,我想抓住第二个字符或 4,并将其变成整数。我使用 strcpy 将字符串添加到 char 字符串数组中以获取 4,但我遇到了一些错误,我不太确定如何修复它们。这是我的代码

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

int search(struct id array[],char* tok);


int main(void)
{

    char* token2 = "1405";
    char* text[] = malloc(strlen(token2)+1);
    strcpy(text,token2);
    int i,number;
    for(i=0;i<4;i++)
        if(i==1)
        {
        number = atoi(token2[i]); }
    printf("%d\n",number);

我得到以下编译错误

gcc structures_arrayof.c
structures_arrayof.c: In function ‘main’:
structures_arrayof.c:23:20: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default]
     char* text[] = malloc(strlen(token2)+1);
                    ^
structures_arrayof.c:23:5: error: invalid initializer
     char* text[] = malloc(strlen(token2)+1);
     ^
structures_arrayof.c:24:5: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type [enabled by default]
     strcpy(text,token2);
     ^
In file included from structures_arrayof.c:5:0:
/usr/include/string.h:129:14: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
 extern char *strcpy (char *__restrict __dest, const char *__restrict __src)

【问题讨论】:

  • text 只是一个 char*,而不是一个 char * 数组。还包括用于 malloc 的 stdlib.h。
  • malloc() 位于 &lt;stdlib.h&gt; 中,您未将其包括在内。无论如何,你的程序是不完整的。哎呀,即使你的main() 也不是。
  • @MichaelDorgan char *text[] 是非法的吗?肯定错了,不违法。
  • char* text[] = 应该是char *text =
  • atoi 需要一个字符串作为输入,而不是 char。对于charx-'0' 无论如何都足够了。

标签: c arrays string


【解决方案1】:

atoi 用于将 字符串 转换为整数。但是,您想转换单个字符

你可以写:

number = token2[i] - '0';

这是因为数字 '0''9' 具有连续的字符代码。不需要 malloc 或其他任何东西。

【讨论】:

  • 很高兴有人发布了这个。惊讶于很少有人意识到这种将字符数字转换为整数的简单方法
  • 你也要解决所有其他缺陷吗?
  • @Deduplicator 被“不需要 malloc 或其他什么”所涵盖。有缺陷的代码可以全部删除。 (如果有人好奇,cmets 也会对此问题进行讨论)。不过,问题标题可以通过编辑来完成。
【解决方案2】:

与你正在做的事情一起工作......

这应该会清除第一组错误。

char* text = malloc(strlen(token2)+1);

你需要一个指向 char 字符串的指针。

要进行转换,您需要空终止字符串。

token2[i+1]=0; 

那你就可以了

number = atoi(token2[i]);

【讨论】:

  • 至少还需要加上#include &lt;stdlib.h&gt;来修复隐式声明警告。
【解决方案3】:

第一个错误:
你忘了#include &lt;stdlib.h&gt; 来获取malloc

第二个错误:
表示为指向char 的指针的字符串,因此您只需要
char *text = malloc(strlen(token2)+1);
去掉括号。
或者,由于大小在编译时是已知的,您可以在不使用 malloc 的情况下使用 char text[5]; 声明它

第三个错误:
它警告您使用了错误类型的指针。这应该通过更改上述声明来解决。

第四个错误(不在您粘贴的编译器输出中):
正如马特麦克纳布指出的那样,你不应该使用 atoi。将其替换为
number = token2[i] - '0'; 这将减去 0 的 ASCII 值,返回字符的整数值。

附加评论:我建议更改if 语句的间距/缩进样式。将左大括号放在自己的行上,将右大括号放在与最后一个语句相同的行上是非常非常的,它会降低可读性。
我建议你选择一种标准的风格并尝试坚持下去。就个人而言,我喜欢Linux Kernel Coding Style,但请随意选择适合您的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2022-01-13
    相关资源
    最近更新 更多