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);