好的,长话短说我遇到了一些麻烦: 我正在尝试将字符数组(字符串)的起始地址发送到函数。一旦函数获得指针,我希望函数逐个解析字符(以便修改某些字符)。截至目前,我只是将其设置为打印每个角色,但我仍然失败了。
这就是我所拥有的:
#include "system.h"
#include <stdio.h>
typedef unsigned int uint32;
typedef unsigned short uint16;
typedef unsigned char uint8;
void EXCLAIM(char *msg){
char the_char = 0;
the_char = msg;
while (the_char != 0)
{
printf(the_char);
*msg = *(msg++);
the_char = *msg;
}
}
int main(void) {
char *first_str = "This is a test. Will this work. I. am. Not. Sure...";
while (1) {
EXCLAIM(first_str);
}
}
编辑:
以下是我尝试做的更新代码;发送指针并遍历每个字符,用感叹号替换所有句点。
#include "system.h"
#include <stdio.h>
typedef unsigned int uint32;
typedef unsigned short uint16;
typedef unsigned char uint8;
void exclaim(char *msg){
int i;
for( i=0; msg[i]; i++ )
{
if (msg[i] == '.') {
msg[i] = '!';
}
}
printf(msg);
}
int main(void) {
char *the_sentences = "This is a test. Will this work. I. am. Not. Sure...";
while (1) {
exclaim(the_sentences);
}
}
谢谢大家的帮助!
答案 0 :(得分:1)
尝试这样的事情:
#include <stdio.h>
void exclaim(char * s)
{
while (*s != '\0')
{
putc(*s);
++s;
}
}
注意:
不要喊。除了预处理器宏之外,不要使用全部大写。
打印字符,而不是字符串。
无需再制作副本。函数参数已经一个可以直接使用的局部变量。
答案 1 :(得分:1)
你的主()很好。
问题在于EXCLAIM中的指针算术。
我可以看到两个有用的不同版本:
使用指针算术
while (*msg)
{
printf("%c", *msg);
msg++
}
使用索引
int i;
char the_char;
for( i=0; msg[i]; i++ )
{
printf( "%c", msg[i] );
}
答案 2 :(得分:1)
您应该使用:
the_char = *msg;
不
the_char = msg;
答案 3 :(得分:1)
*msg = *(msg++);
你想用这行代码做什么?你明白它究竟是做什么的吗?首先,您需要知道msg++
更改指针的值。然后指定USED指向新位置的任何内容。这意味着整个字符串将被替换为字符串中第一个字符的副本。
故事的寓意是不要在一行代码中做太多。您必须特别注意增量运算符++
。即使是经验丰富的程序员通常会将msg++
这样的东西放在自己的行中,因为当你尝试将它与复杂的表达式混合时会变得太复杂。
答案 4 :(得分:1)
未提及的东西,但是,尝试修改字符串文字是未定义的行为。
您需要更改以下行,
char *the_sentences = "This is a test. Will this work. I. am. Not. Sure...";
到一个数组。
char the_sentences[] = "This is a test. Will this work. I. am. Not. Sure...";
然后随意修改你的功能内容。
#include <stdio.h>
void foo(char *msg)
{
for (; *msg; msg++)
if (*msg == '?')
*msg = '!';
}
int main(void)
{
char line[] = "Hello, world?? How are you tonight??";
foo(line);
puts(line);
return 0;
}