#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语句之间,我试图在&#39; a&#39;的特定点分配值。到了0.我不确定我应该怎么做这个,我想保持变量也一样。
答案 0 :(得分:0)
你的问题是你传给parseString
一个指向a的指针
字符串字面量。修改字符串文字的内容是未定义的行为
并且大多数时候字符串文字都驻留在只读内存中,这就是原因
你的程序崩溃了。
您必须创建一个数组并使用所需的字符串对其进行初始化 将该数组传递给函数:
#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
的{{1}}中,我计算了
array
数组的长度。请注意,这只适用
使用纯数组,如果你在sizeof text / size *text
中执行了sizeof str / sizeof *str
,那么
肯定会得到一个错误的结果,这就是为什么你应该总是通过
阵列的长度。
答案 1 :(得分:0)
您的程序存在未定义的行为。
根据尝试修改字符串文字的标准导致未定义的行为,因为它们可能存储在只读存储中或与其他字符串文字结合使用。
您正在将字符串文字传递给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...
。