如何避免在C中将字符串作为数组循环浏览?

时间:2018-12-15 20:22:21

标签: c

在此示例中,我试图将整数文字与types []数组进行匹配。从技术上讲,printf()应该为printf(“变量%c =%d(%s)\ n”),但是如果我没有将type [i]指定为字符,则会出错。

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

extern int ints[];
extern char strs[];
extern char types[];
extern void intro();

int ints[] = {
  212, 215u, 0xFeeL, 07, 032U, 85, 0213, 0x4b, 30, 30u, 30l, 30ul  
};

char strs[] = {
  'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'  
};

char types[] = {
    "decimal",
    "decimal unsigned",
    "hexadecimal long",
    "octal",
    "octal unsigned",
    "decimal",
    "octal",
    "hexadecimal",
    "decimal",
    "decimal unsigned",
    "decimal unsigned",
    "decimal unsigned long"
};

int main(){
    int i;
    for(i = 0; i < 12; i++){
       printf("The variable %c = %d (%c) \n", strs[i], ints[i], types[i]);
    }
    return 0;
}

void intro(){
    printf("------\n");
    printf("Looping through these results \n");
    printf("------\n");   
}

我确信对于C经验丰富的人来说,我缺少一些简单的东西。

谢谢!

3 个答案:

答案 0 :(得分:3)

您犯了一个愚蠢的错误。错误是您的types []数组是字符数组而不是字符串数组。

一个字符是:

char types = 'a';

一个字符数组是:

char types[] = {'a', 'b'};

字符串是:

char types[] = "hello";

还有:

char *types = "hello";

一个字符串数组是:

char *types[] = {"hello", "world"};

您打算做的是:

char *types[] = {
    "decimal",
    "decimal unsigned",
    "hexadecimal long",
    "octal",
    "octal unsigned",
    "decimal",
    "octal",
    "hexadecimal",
    "decimal",
    "decimal unsigned",
    "decimal unsigned",
    "decimal unsigned long"
};

现在您可以将printf更改为:

printf("The variable %c = %d (%s) \n", strs[i], ints[i], types[i]);

答案 1 :(得分:0)

您需要一个字符串数组(const char *,而不是字符数组(char),即:

const char *types[] = {

有了这个选项,您就不会在printf(应该在其中)中收到有关%s的任何警告/错误。

答案 2 :(得分:0)

append

这是string literal。它的类型是"decimal" ,它是一个字符数组。在大多数情况下,类型数组会衰减(读为:原子性地改变)为类型指针。

char[]

这是无效的代码,但通常仅带有一个警告进行编译。在这里,字符串文字被转换为char a = "decimal"; 类型,即指向char的指针。然后将指向char value 的指针转换为char value (因此,它正在从其中删除信息,因为通常char*sizeof(char) = 1小得多)。

sizeof(char*)

同样的事情一遍又一遍地发生。 char a[] = { "decimal", "blabla", }; 指针 value 被转换为char值。可以用(假设CHAR_BIT = 8)来更详细地表示:

char*

您想要的是字符串文字数组。您可以通过存储指向字符串文字的指针数组来实现这一点。 char a[] = { (char)((uintptr_t)(char*)"decimal") & 0xff), (char)((uintptr_t)(char*)"blabla") & 0xff), }; 指针数组,即char*类型。

char*[]

或者您可以存储字符串:

const char *types[] = {
    "decimal",
    "decimal unsigned",
    "hexadecimal long",
    "octal",
    "octal unsigned",
    "decimal",
    "octal",
    "hexadecimal",
    "decimal",
    "decimal unsigned",
    "decimal unsigned",
    "decimal unsigned long"
};

即。这是一个双数组。

注意:字符串文字是不可变的,对其进行修改是未定义的行为(阅读:请勿这样做)。