我制作了以下程序,使用read
(C中的系统调用)从用户那里获取字符串(长度小于100)。
#include<stdio.h>
#include <unistd.h>
#include <string.h>
int main() {
char *s;
int a = read(0, s, 100);
s[a-1] = '\0';
printf("\"%s\" \n read returned: %i; NUL at: %u", s, a, strlen(s));
return 0;
}
我的预期是,在用户输入换行字符之前,它会获得字符。然后它会将'\n'
字符替换为'\0'
,然后打印出来。
该程序运行良好,直到我在stdin
中输入15个或更少字符,但在超过16个字符时停止工作。
我的意见如下:
E:\My Files\Codes>a.exe
1234567890123456
"1234567890123456"
returned = 17; length = 16
E:\My Files\Codes>a.exe
12345678901234567
[My program hanged on this input.]
为什么它只挂在16?这个 2 ^ 2 有什么特别之处? 后脚本:我使用 string.h 来获取字符串的长度。一旦我的程序开始正常运行,我将删除它。
答案 0 :(得分:3)
我一直在测试你的代码。缺点是:你有一个指向无处的指针。我解决了它为你的字符串(char数组)保留和分配内存。我将发布工作代码:
#include <stdlib.h> // It is needed for malloc, free, etc...
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main() {
char *s = malloc(100*sizeof(char)); // Allocate memory with malloc
int a = read(0, s, 100);
s[a-1] = '\0';
printf("\"%s\" \n read returned: %i; NUL at: %u", s, a, strlen(s));
free(s); // You need liberate memory before exit
return 0;
}
此外,解决此问题的其他方法是:没有动态内存:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main() {
char s[100]; // s is a char array of 100 elements
int a = read(0, s, 100);
s[a-1] = '\0';
printf("\"%s\" \n read returned: %i; NUL at: %u", s, a, strlen(s));
return 0;
}