Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的基本字符串数组操作_C - Fatal编程技术网

C语言中的基本字符串数组操作

C语言中的基本字符串数组操作,c,C,我有这个: int main() { char m[] = "12aa34"; for (int i = 0; m[i] != '\0'; i++) { //printf("%c\n", m[i]); m[i] = m[i] + (isdigit(m[i]) ? -2 : 1); puts(m); printf("\n"); } //printf("\n"); //puts(m);

我有这个:

int main()
{
    char m[] = "12aa34"; 
    for (int i = 0; m[i] != '\0'; i++)
    {
        //printf("%c\n", m[i]);
        m[i] = m[i] + (isdigit(m[i]) ? -2 : 1);
        puts(m);
        printf("\n");
    }
    //printf("\n");
    //puts(m);
    return 0;
}

puts(m) output: /2aa34
                /0aa34 
                /0ba34 
                /0bb34 
                /0bb14
                /0bb12
关于puts(m)输出的第一个问题: 经过一番挖掘,我认为这与ASCII有关。可以说,操作是在表示层完成的吗?我检查了它,并以某种方式与
/
的结果相关联(即
1
的十进制值是
49=>49-2=47
,即
/
),然后对于
2
50=>50-2=48,即
0
,然后对于
a
97=>97+1=98,即
b
,依此类推

关于第一个注释的第二个问题
printf


m[]
指针字符对吗?当字符串被
m[i]=m[i]+(isdigit(m[i])?-2:1)修改时,Now不应该被更改
给我新的值而不是旧的值?

我真的不理解你的问题,但我想帮你

在循环中,首先修改字符串的一个字符,然后打印整个字符串标准输出。这是因为,正如你所说,这些输出字符是由ASCII字符集产生的

char m [] = "foo";  
和写作一样

char * m = "foo";  
唯一的区别是,您可以在编写时使用第一个方法初始化空字符串

char m [20];  
m [19] = '\0';  
您将创建一个长度为20个字符的空字符串。必须将最后一个字符设置为\0,以便字符串终止

使用char*方式时,必须创建稍微不同的循环,如:

char * ptr;
for (ptr = m; * ptr != '\0'; ptr++){
    //Do something, * ptr is used to get and modify the current value
}
在没有索引的情况下访问char[],例如(只有名称)引用数组或字符串中第一个元素的指针


我希望这是您想要的,如果不是,请告诉我。

字符是整数值,从中添加/减去
1
会影响整数值。如果这就是你所说的“代表性层面”的运作,那么——是的——就是这样

对于ASCII字符集,
'0'-1
(即从字符
'0'
中减去数值
1
)是字符
'/'
。请注意,尽管许多实现(编译器、库)都支持ASCII,但实际上C标准并不需要它。但是,还没有任何标准化字符集的字符
'0'
的数值为零

至于你的第二个问题。。。。首先,您关于“
m[]
是指针字符”的陈述是不正确的(事实上,这是毫无意义的)
m
char
的数组。其次,注释掉的
printf
在实际修改字符之前,在循环的每次迭代中打印出
m[i]
(数组
m
中的
i
第个字符)。使用语句(对于循环的每个迭代)


事件的顺序是固定的。第一个
printf()
语句输出
m[i]
的值,然后修改
m[i]
(即
m
中只有一个字符),然后
put(m)
输出整个数组
m
,然后输出换行符。如果您希望在第一个
printf()
之前修改
m[i]
,那么您需要三思。源文件中语句的顺序很重要。

您是对的,C中字符的表示形式是一个数字

例如,在C语言中,“字符”通常是一个“有符号字符”或一个字节数,范围为-128。。127您可以为其分配字符,例如m[1]=“a”,但这仍然是一个整数分配。唯一的区别是它的范围只有-128。。127

ASCII字符集为0。。127,但char也可以表示负数

如果改为使用无符号字符,则范围将被视为代表0..255,127以上的字符称为控制字符

此声明

char m[] = "12aa34";
表示在堆栈上创建一个7字节数组,并使用与ascii字符“1”、“2”、“a”、“a”、“3”、“4”、“0”(nul)对应的字节值对其进行初始化

当您使用它时,唯一可以被视为指针的是变量m本身。但是,在这里,m存储将分配在堆栈上,而不是堆上。 编译程序时,编译器会在编译后的代码中存储字符串“12aa34\0”。调用函数时,编译后的代码将通过递增堆栈指针在堆栈上分配至少7个字节,然后通过从代码中存储的“12aa34”字符串复制来初始化这7个字节。因此,您的代码完全可以更改堆栈上m变量的值

如果您这样做:

char *m = "12aa34";
然后,m不是在堆栈上有7个字节的存储,即字节值“1”(49)、“2”(50)等。相反,m是指在堆栈上分配的8个字节的位置,这些字节是一个指针(64位内存地址),直接指向“12aa34”内存中的字符串,由编译器存储在可执行文件中,并在执行程序时加载到内存中。在这种情况下,不应该允许修改m[i],因为内存中加载可执行代码的部分通常是只读的。 这在C++中更清楚,其中字符串文本“示例”的“类型”不只是“char *”,而是“char const *”,它表示不能修改字符值。 在示例代码中,注释的printf确实应该在更改每个未修改的字符之前打印它

要帮助了解正在发生的事情,请尝试以下方法:

char *orig = ”12aa34";
char *another = "12aa34";
char m[] = "12aa34";

printf(" %p  %s\n",  orig,orig);
printf("%p %s\n", another, another);

printf("%p %s\n", m, m);

m[0] = 'x';
printf("%p %s\n", m, m);
您会发现“orig”和“other”的指针和字符串值是相同的

然而,为“m”打印的指针值将不同,尽管字符串值一开始是相同的,修改后又会不同。

什么是“指针字符”
m[]
是ch的数组
char *orig = ”12aa34";
char *another = "12aa34";
char m[] = "12aa34";

printf(" %p  %s\n",  orig,orig);
printf("%p %s\n", another, another);

printf("%p %s\n", m, m);

m[0] = 'x';
printf("%p %s\n", m, m);