language c char *从第二个元素而不是第一个元素开始

时间:2017-01-22 23:14:03

标签: c arrays char

我们在大学创建了这个程序,通过语言c的地址创建了一个字符数组。 但第一个元素(char * str)输出一个奇怪的空间。 我看到了一些关于字符数组的教程,其中第一个元素是我们输入的第一个字符。

那为什么会这样呢?是他们发生这种情况的一些情况?如果是这样我怎么知道我的字符串是从第一个元素还是第二个元素开始而不是每次都使用printf?

这是我的程序

#include<stdio.h>
#include<stdlib.h>

char* newStr(int n);
int length(char* str);

int main() {
 int n,i;
 printf("Number of characters \n");
 scanf("%d",&n);
 char* str = newStr(n);
 char* c = malloc(n*sizeof(char)+1);
 c=str;

 // check that c[0]=' ' and c[n+1]=\0
 for(i=0;i<=n+1;i++) printf("*(str+%d) = %c \n",i,*(c+i));

 return 0;
}

char* newStr(int n) {
 int i;
 char* c;
 c=malloc(n*sizeof(char)+1);
 printf("Enter a word of %d characters \n",n);
 for(i=0;i<=n;i++) {scanf("%c",(c+i));}
 *(c+n+1)='\0';
 return c;
 }

int length(char* str) {
 int i=0;
 while(*(str+i)!='\0'){i++;}
 return i-1;
}

这是输出

Number of characters
5
Enter a word of 5 characters
hello
*(str+0) = 

*(str+1) = h
*(str+2) = e
*(str+3) = l
*(str+4) = l
*(str+5) = o
*(str+6) = 
The length of your string is 5

有人可以用简单的方式向我解释,因为我对c很新。 提前谢谢

2 个答案:

答案 0 :(得分:0)

有人已在评论中回答说scanf()函数不使用尾随的换行符。

因此,如果用户在键盘上按“Enter”,然后代码中出现scanf(),则会记录Enter press。

另外,我想把注意力集中在newStr()函数上。 在那里为新字符串分配空间并将其存储在动态字符数组中,即char * c,然后返回该指针。

但是在你的main()中你保存了str中的返回值,并且由于某种原因试图将它复制到另一个指针(顺便说错了)?

char* str = newStr(n);
char* c = malloc(n*sizeof(char)+1);
c=str;

str是ALREADY你可以使用的字符串,不需要在char * c上创建另一个malloc。当你写作     C = STR; 实际上,您正在为char * c分配str的地址,而不是str指向的值,从而生成这行代码:

char* c = malloc(n*sizeof(char)+1);

完全无用且容易出错,因为丢失了地址后你将无法释放该指针。

我不知道我是否清楚......

答案 1 :(得分:0)

如前所述,scanf("%d",&n)不会使用换行符,但会scanf("%d\n",&n)

BTW,只是为了提出一个简短(但可能是hacky)的方法,它使用scanf("%20s",...),但使用可变宽度说明符而不是硬编码20

int n;
char format[20];
scanf("%d\n",&n);
char *result = malloc((n+1) * sizeof(char));
sprintf(format, "%%%ds", n);
scanf(format, result);