0

假设我有一个字符串“nice to meet you!”,我想打印不带第一个字母的字符串,而不是只打印“ice to meet you!”。

我尝试如下操作,但是程序在编译运行后会自行关闭。

#include <stdio.h>

int main(void)
{
 char *s = "nice to meet you!";

 printf("Original string: %s\n",*s);

 printf("Pointer plus one gives: %s\n", *(s+1));

 return 0;
}

我的程序有什么问题?

4

6 回答 6

6

你应该打印s而不是*s

%s 格式标记需要一个指针。 s是指向字符串的指针,而*s是字符串中第一个字符的值。 printf("%s", *s)将从字符串中第一个字符的字符代码的地址开始打印一个字符串。此地址可能对您的进程无效,因此您将获得未处理的异常。

于 2012-09-25T12:21:35.403 回答
3

*s 取消引用导致 char 的指针。所以尝试以下方法:

#include <stdio.h>

int main()
{
 char *s="nice to meet you!";

 printf("Original string: %s \n",s);
 printf("Original first char: %c\n", *s);

 printf("Pointer plus one gives: %s\n", (s+1));

 return 0;
}

来看看区别。

问候

于 2012-09-25T12:25:27.567 回答
2

嗯,您使用指向字符串指针的指针而不是指向字符串的指针(使用 printf)。尝试

printf ("aaa %s bbb\n", s ); 

或者

printf ("aaa %s bbb\n", s+1 ); 
于 2012-09-25T12:22:22.940 回答
1

我尝试如下操作,但是程序在编译运行后会自行关闭。

通过终端运行您的程序。你用什么来编译和运行你的程序?

我的程序有什么问题?

*(s+1) 是单个字符。

于 2012-09-25T12:23:50.153 回答
0

代码正在做你告诉它做的事情,我想你可能不明白你告诉它做什么。

char *s = "nice to meet you!";

// s is a pointer to a character
// s* is the character that "s" points to

您已s指向字符“n”。s恰好指向以 NULL 结尾的字符串文字中的第一个字符。

printf("Original character: %c\n",*s); //Note the %c, we're looking at a character
output-> Original character: n

printf("Original string: %s\n",s); //Note the %s, and we're feeding the printf a pointer now
output-> Original string: nice to meet you!

当涉及到偏移量时:

*s     = the character s is pointing at, 'n'
*(s+1) = the next character s is pointing at, 'i'

与:

s     = the address of the string "nice to meet you"
(s+1) = the address of the string "ice to meet you"
于 2012-09-25T13:59:29.667 回答
0

试试这个,只需将 dowhatopwant 函数与您的字符串一起使用:

void my_putchar(char c)
{
  write(1, &c, 1);
}

void dowhatopwant(char *str)
{
  int cnt = 1;
  while (s[cnt])
  {
     my_putchar(s[cnt]);
     cnt++;
  }
}
于 2012-09-25T12:26:00.853 回答