c - strlen 返回实际长度+2
问题描述
为什么strlen
即使文件包含一个 4 个字母的单词,单词后面没有空格,但返回 6 而不是 4?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void leggi_file(FILE *in, char *s);
char * vect(char *s);
int pal(char *);
int main(void){
FILE *in;
char *s[100], *v;
int n;
in = fopen("testfile", "r");
leggi_file(in,*s);
printf("%s",*s);
v = vect(*s);
printf("%s",v);
n = pal(*s);
printf("%d",n);
int dim = strlen(*s);
printf("%d",dim);
return 0;
}
void leggi_file(FILE *in, char *s){
int c, count = 0;
while((c=getc(in))!=EOF && count < 100){
s[count] = c;
count++;
}
}
char * vect(char *s){
char *vect;
int dim = strlen(s);
vect = malloc((dim+1)*sizeof(char));
vect = s;
return vect;
}
int pal(char *s){
int i, tmp, dim;
dim = strlen(s);
tmp=dim-1;
for(i=0; i<(dim/2); i++){
if(*(s+i) != *(s+tmp))
return 0;
else
tmp--;
}
return 1;
}
testifile 包含“安娜”
解决方案
你可能想要这个。解释在评论中。但仍有进一步改进的空间。
我不确定打电话的目的vect
是什么。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void leggi_file(FILE *in, char *s);
char *vect(char *s);
int pal(char *);
int main(void) {
FILE *in;
char s[100], *v; // just use s, you want an array of char, not an array of
int n; // pointers to char
in = fopen("data.txt", "r");
if (in == NULL) // check if file could actually be opened
{
printf("Can't open file\n");
exit(1);
}
leggi_file(in, s);
fclose(in); // close file
printf("%s", s);
v = vect(s);
printf("%s", v);
n = pal(s);
printf("%d", n);
int dim = strlen(s);
printf("%d", dim);
free(v); // free memory
return 0;
}
void leggi_file(FILE *in, char *s) {
int c, count = 0;
while ((c = getc(in)) != EOF && count < 100) {
if (c == '\n') // stop on first end of line
break;
s[count] = c;
count++;
}
s[count] = 0; // put string terminator, omitting this
} // was one of the major problems in your code
char * vect(char *s) {
char *vect;
int dim = strlen(s);
vect = malloc((dim + 1) * sizeof(char));
strcpy(vect, s); // copy string
return vect;
}
int pal(char *s) {
int i, tmp, dim;
dim = strlen(s);
tmp = dim - 1;
for (i = 0; i < (dim / 2); i++) {
if (*(s + i) != *(s + tmp))
return 0;
else
tmp--;
}
return 1;
}
(*(s + i) != *(s + tmp))
如果你写(这s[i] != s[tmp])
是完全等效的。
推荐阅读
- sql-server - 在 SQL 查询中获取 XML 值
- jenkins - 詹金斯上的 Gradle 奇怪的错误
- r - 如何在R中将字符串拆分为规则间隔?
- javascript - 使用java函数将html图标放入表中
- sql-server - 在 linux 服务器 ubuntu 16.04 中安装 SQL Server 2019 时出错
- javascript - null 的 JavaScript 属性,将值传递给 var
- angular - 关于 angular.json
- c# - 如何多次使用相同的命令?
- curl - 使用 curl 从 gmail imap 获取最近的电子邮件
- python - 在 Python 中操作包含括号的字符串