在char数组指针中指定一个值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在char数组指针中指定一个值相关的知识,希望对你有一定的参考价值。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX40 40
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
Int40 *parseString(char *str)
{
Int40 *p;
char *ptr;
int i, len, value, ptrValue;
printf("%s\n", str);
for(i = 0; i < 40; i++)
{
if(str[i] == 'a')
{
printf("%c\n", str[i]);
str[i] = '0';
printf("%c\n", str[i]);
}
}
}
int main(int argc, char *argv[])
{
// char string[40] = "
// char *str = string;
Int40 *p;
parseString("0123456789abcdef0123456789abcdef01234567");
return 0;
}
在我的parseString函数中,在两个printf语句之间,我试图将'a'的特定点的值赋给0.我不知道我应该如何尝试这个,我想保持变量也一样。
这里你的问题是你向parseString
传递一个指向字符串文字的指针。修改字符串文字的内容是未定义的行为,并且大多数时候字符串文字驻留在只读内存中,这就是程序崩溃的原因。
您必须创建一个数组并使用您想要的字符串对其进行初始化,然后将该数组传递给该函数:
#include <string.h>
void parseString(char *str, size_t len)
{
printf("%s\n", str);
for(size_t i = 0; i < len; i++)
{
if(str[i] == 'a')
{
printf("%c\n", str[i]);
str[i] = '0';
printf("%c\n", str[i]);
}
}
}
int main(int argc, char *argv[])
{
char text[] = "0123456789abcdef0123456789abcdef01234567";
parseString(text, sizeof text / sizeof *text);
return 0;
}
在将数组传递给函数时要记住,该函数只获得指向数组第一个元素的指针。因此,被调用的函数无法确定数组的长度。更好的做法是传递数组的长度。这就是为什么我在size_t len
中添加parseString
作为参数。在宣布main
的array
中,我用sizeof text / size *text
计算数组的长度。请注意,这只适用于纯数组,如果你在sizeof str / sizeof *str
中执行parseString
,你肯定会得到一个错误的结果,这就是为什么你应该总是传递数组的长度。
您的程序具有未定义的行为。
根据标准尝试修改字符串文字导致未定义的行为,因为它们可能存储在只读存储中或与其他字符串文字组合。
您正在将字符串文字传递给parseString()
函数:
parseString("0123456789abcdef0123456789abcdef01234567");
并在parseString()
,试图修改它:
str[i] = '0';
相反,在main()
函数中你可以这样做:
char str[] = "0123456789abcdef0123456789abcdef01234567";
这相当于:
char str[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','0','1','2','3','4','5','6','7','\0'};
[注意结尾处的终止空字符。]
所以,你可以这样做:
#include <stdio.h>
void parseString(char *pstr)
{
char * str = pstr;
printf("%s\n", str);
for(int i = 0; str[i] != '\0'; i++)
{
if(str[i] == 'a')
{
printf("%c\n", str[i]);
str[i] = '0';
printf("%c\n", str[i]);
}
}
printf("%s\n", pstr);
}
int main(int argc, char *argv[])
{
char str[] = "0123456789abcdef0123456789abcdef01234567";
parseString(str);
printf("%s\n", str);
return 0;
}
请注意,在我的程序中,我只展示用'a'
字符替换'0'
。因此,我删除了OP代码中存在的typedef struct Int40...
。
以上是关于在char数组指针中指定一个值的主要内容,如果未能解决你的问题,请参考以下文章
如何将一个char数组中元素插入到另一个char数组中指定元素后面,在java语言环境,但不能使用java的内置函数