1

我制作了以下程序,该程序使用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',并打印它。

该程序运行良好,直到我在 中输入 15 个或更少的字符stdin,但当超过 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只是为了获取字符串的长度。一旦我的程序开始运行良好,我将删除它。

4

1 回答 1

3

我一直在测试你的代码。缺点是:你有一个指针,它不指向任何地方。我解决了它为您的字符串(字符数组)保留和分配内存。我将发布工作代码:

#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;
}
于 2018-04-05T22:15:19.713 回答